[阅读: 820] 2006-01-11 16:56:23
IdUdpServer的OnRead事件里,IdUdpServer在内部触发事件时调用了Synchronize来做同步。因为事件是在程序的主线程里引发的,做同步也是应该的。
然后我的程序拿到数据后,把数据丢给一个 ThreadList,而把数据丢给ThreadList就会调用到LockList,在 ThreadList.LockList方法内部,首先要进入临界区,既调用EnterCriticalSection。这样就会把程序搞死掉,再也不响应WINDOWS的消息。
我自己做个实验,做2个线程,一个线程A不停地产生数据,引发一个事件把数据丢出去。在程序主线程里创建一个方法绑定到线程的事件,等于线程在调用主线程的一个方法。在主线程的那个方法里,调用 ThreadList.LockList 把数据加到List里去。
另一个线程B不停地从那个List里把数据取出来,然后引发一个事件。当然也在主线程里做一个方法绑定到那个事件,在这个方法里,把数据写进一个 Memo1 来显示。
这时候,一切工作正常。但如果在线程A引发事件的地方,加上同步 Synchronize ,则会将程序搞死掉,完全不响应WINDOWS消息。这时候,不管在线程的任何位置加上 Application.PostMessage,都没用。
看来,要避免线程之间互相通过一个公共的List类来交换数据,最简单的办法是把要交给另外一个线程的数据,将数据类的指针用发消息的办法发给另外一个线程。