原文来自:http://blog.csdn.net/silvervi/article/details/5874212
红色字为博主添加:
问题描述:AfxBeginThread创建一个线程后,在线程中操作UI的控件,例如EDIT。在UI的button里停止线程,并等待结束,一般用WaitforsingleObject,但是这个函数会导致UI消息阻塞,如果这个时候线程里正好操作UI控件并需要用到SendMessage,则线程在等待消息发送完,WaitforsingleObject在等待线程,而WaitforsingleObject又阻塞了消息,这样就导致了死循环。下文为解决方法,已经省略,全部可以参考原文地址:
还可以看出:MsgWaitForMultipleObjects实际上在这其中并没有起到什么实质性的作用,只是定期返回而已,那么根据此,可以用固定时间的WaitForSingleObject来代替MsgWaitForMultipleObjects,并且循环等待 ;同时,我们也没有必要手动DispatchMessage,只需要PeekMessage即可,需要注意的是如果删除了DispatchMessage,在PeekMessage时不能将消息从队列取走。代码如下:
DWORD dwRet = 0;
MSG msg;
while (TRUE)
{
dwRet = WaitForSingleObject(m_hThread, 50);
switch(dwRet)
{
case WAIT_OBJECT_0:
break; //break the loop
case WAIT_TIMEOUT :
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
continue;
default:
break; // unexpected failure
}
break;
}
经过测试,代码运行正确!
当然,由于MsgWaitForMultipleObjects是基于消息驱动的返回,WaitForSingleObject只是普通的定时返回,而本文的情况就是由于消息阻塞造成的,所以MsgWaitForMultipleObjects比WaitForSingleObject在应用时时效性更好,如果改成WaitForSingleObject,在测试中感觉会有略为滞后,所以实际还是以MsgWaitForMultipleObjects为佳。