多线程里,各个线程同时访问的一段代码,需要同步,是什么意思?

时间:2021-04-05 18:08:43
我这里有2个线程,通过动态创建的idhttp.get()得到的结果,进行处理
idhttp.get()得到结果没问题,处理就来问题了

好像没反应

查了下网上,好像说是各个线程同时访问的一段代码,需要同步。

请问我处理2个线程的返回结果,需要同步么?怎么同步?
可是2个线程也是同时访问 http.get()啊,怎么就正常了

请给个简单的例子,多谢。

13 个解决方案

#1


如果是多个线程访问同一个控件,需要协调(Synchronize)
如果是线程内部创建的控件,应该没关系吧。

#2


执行同一段代码是不需要同步的,只有访问,特别是改写同一段数据,或者调用同一对象的可能会改写数据的非线程安全的方法才需要同步处理.

#3


执行同一段代码是不需要同步的,只有访问,特别是改写同一段数据,或者调用同一对象的可能会改写数据的非线程安全的方法才需要同步处理.

帮忙顶一下 

#4


感谢各位答复
在主界面有个MEMO,2个线程得到的返回结果,在execute里处理,并将处理结果显示在memo里

线程里的处理:
s :=idhttp.get(...);
xmldoc :=ixmldocument.loadxmldata(s);
if xmldoc.... then
..
else
..

请问execute里的这段处理代码,是不是需要同步?2个线程的返回结果都需要这么处理

#5


执行同一段代码是不需要同步的,只有访问,特别是改写同一段数据,或者调用同一对象的可能会改写数据的非线程安全的方法才需要同步处理.
2个线程对主界面的Memo操作的话,就属于调用同一个对象了

#6


2个线程在得到返回结果并处理后,都需要显示到memo里,那么这个同步应该怎么写呢?
请给个简单的例子说明下,多谢了

我现在得到返回结果并处理,结果memo里没有任何显示,就是因为没有同步么?

#7


但是如果我得到返回结果不做处理,直接显示在memo里,是正常的。

#8


在线程内,把需要操作Memo的代码写到一个过程里(这个过程好像不能有参数,参数放到线程的属性里好了),然后,线程内调用:
Synchronize(Proc1);
作用是让主线程去调用这个Proc1。这样就不会死锁了。

#9


引用 7 楼 shmily0616 的回复:
但是如果我得到返回结果不做处理,直接显示在memo里,是正常的。

如8楼所说,显示到Memo当中需要通过Synchronize处理.
至于处理后就没有内容,那是处理过程的问题,同样也需要注意公用对象当中数据的改写.

#10


感谢各位答复,我再去试试。

#11


一个消费者应该依次接收二个生产者产生的信息

#12


一个消费者应该依次接收二个生产者产生的信息

#13


感谢各位答复,问题基本解决了,还有点细节我再搞搞,发分。

#1


如果是多个线程访问同一个控件,需要协调(Synchronize)
如果是线程内部创建的控件,应该没关系吧。

#2


执行同一段代码是不需要同步的,只有访问,特别是改写同一段数据,或者调用同一对象的可能会改写数据的非线程安全的方法才需要同步处理.

#3


执行同一段代码是不需要同步的,只有访问,特别是改写同一段数据,或者调用同一对象的可能会改写数据的非线程安全的方法才需要同步处理.

帮忙顶一下 

#4


感谢各位答复
在主界面有个MEMO,2个线程得到的返回结果,在execute里处理,并将处理结果显示在memo里

线程里的处理:
s :=idhttp.get(...);
xmldoc :=ixmldocument.loadxmldata(s);
if xmldoc.... then
..
else
..

请问execute里的这段处理代码,是不是需要同步?2个线程的返回结果都需要这么处理

#5


执行同一段代码是不需要同步的,只有访问,特别是改写同一段数据,或者调用同一对象的可能会改写数据的非线程安全的方法才需要同步处理.
2个线程对主界面的Memo操作的话,就属于调用同一个对象了

#6


2个线程在得到返回结果并处理后,都需要显示到memo里,那么这个同步应该怎么写呢?
请给个简单的例子说明下,多谢了

我现在得到返回结果并处理,结果memo里没有任何显示,就是因为没有同步么?

#7


但是如果我得到返回结果不做处理,直接显示在memo里,是正常的。

#8


在线程内,把需要操作Memo的代码写到一个过程里(这个过程好像不能有参数,参数放到线程的属性里好了),然后,线程内调用:
Synchronize(Proc1);
作用是让主线程去调用这个Proc1。这样就不会死锁了。

#9


引用 7 楼 shmily0616 的回复:
但是如果我得到返回结果不做处理,直接显示在memo里,是正常的。

如8楼所说,显示到Memo当中需要通过Synchronize处理.
至于处理后就没有内容,那是处理过程的问题,同样也需要注意公用对象当中数据的改写.

#10


感谢各位答复,我再去试试。

#11


一个消费者应该依次接收二个生产者产生的信息

#12


一个消费者应该依次接收二个生产者产生的信息

#13


感谢各位答复,问题基本解决了,还有点细节我再搞搞,发分。