Windows程序中的标准消息循环看起来如下所示:
while(GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage()有点像是特殊版本的WaitForSingleObject(),它等待消息而不是核心对象。一旦你调用GetMessage(),除非有一个消息真正进入你的消息队列(message queue)之中,否则它不会反回。在此期间,Windows就可以自由地将CPU时间给予其他程序。
“常常回到主消息循环”是十分重要的一件事。如果你没这么做,你的窗口就会停止重绘,你的程序菜单就不再有作用。
问题是,如果你正使用WaitForSingleObject()或WaitForMultipleObjects()等待某个对象被激发,你根本没有办法回到主消息循环中去。
当主线程正在处理主消息循环时,不要使用第二个线程来等待handles,因为如果你这么做,只是把问题从某处移到另一处。