为什么在主线程中调用waitfor必须用msgwaitformultipleobjects,而不能用waitforsingleobject等待线程结束呢?因为防止死锁。由于在线程函数execute中可能调用synchronize处理同步方法,而同步方法是在主线程中执行的,如果用waitforsingleobject等待的话,则主线程在这里被挂起,同步方法无法执行,导致线程也被挂起,于是发生死锁。
而改用waitformultipleobjects则没有这个问题。首先,它的第三个参数为false,表示只要线程handle或syncevent中只要有一个signaled即可使主线程被唤醒,至于加上qs_sendmessage是因为synchronize是通过消息传到主线程来的,所以还要防止消息被阻塞。这样,当线程中调用synchronize时,主线程就会被唤醒并处理同步调用,在调用完成后继续进入挂起等待状态,直到线程结束。
至此,对线程类tthread的分析可以告一个段落了,对前面的分析作一个总结:
1、 线程类的线程必须按正常的方式结束,即execute执行结束,所以在其中的代码中必须在适当的地方加入足够多的对terminated标志的判断,并及时退出。如果必须要“立即”退出,则不能使用线程类,而要改用api或rtl函数。