Delphi中的线程类--之(5,大结局)[7]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 raptor 的 blog

为什么在主线程中调用waitfor必须用msgwaitformultipleobjects,而不能用waitforsingleobject等待线程结束呢?因为防止死锁。由于在线程函数execute中可能调用synchronize处理同步方法,而同步方法是在主线程中执行的,如果用waitforsingleobject等待的话,则主线程在这里被挂起,同步方法无法执行,导致线程也被挂起,于是发生死锁。

而改用waitformultipleobjects则没有这个问题。首先,它的第三个参数为false,表示只要线程handlesyncevent中只要有一个signaled即可使主线程被唤醒,至于加上qs_sendmessage是因为synchronize是通过消息传到主线程来的,所以还要防止消息被阻塞。这样,当线程中调用synchronize时,主线程就会被唤醒并处理同步调用,在调用完成后继续进入挂起等待状态,直到线程结束。

 

至此,对线程类tthread的分析可以告一个段落了,对前面的分析作一个总结:

1、  线程类的线程必须按正常的方式结束,即execute执行结束,所以在其中的代码中必须在适当的地方加入足够多的对terminated标志的判断,并及时退出。如果必须要“立即”退出,则不能使用线程类,而要改用apirtl函数。

本文关键:Thread Event CriticalSection Synchronize
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top