主线程里面使用WaitForSingleObject (WaitForMultipleObjects)需要考虑的情况(转)
2013-10-28 15:56
549 查看
下面的代码能够看出什么地方出了问题吗?
线程函数:
DWORD WINAPI ThreadProc(
while ( ! bTerminate)
}
主线程中使用CreateThread启动线程。
当想终止子线程时,在主线程中:
bTerminate = TRUE;
WaitForSingleObject(threadHandle, INFINITE);
可是,以运行到WaitForSingleObject,子线程就Crash了。
为什么呢?
问题原因:
后来我终于在InsertItem的反汇编中发现了如下的代码
call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
可见,InsertItem是必须借助消息循环来完成任务的。如果我们在主线程中WaitForSingleObject了,必然导致主线程阻塞,也就导致了消息循环的阻塞,最终导致工作线程Crash掉了*_*
解决方案:
为了解决在主线程中Wait的问题,微软专门设计了一个函数MsgWaitForMultipleObjects,这个函数即可以等待信号(thread,event,mutex等等),也可以等待消息(MSG)。即不论有信号被激发或者有消息到来,此函数都可以返回。呵呵,那么我的解决办法也就出来了。
将上面的WaitForSingleObject用下面的代码替换:
while(TRUE)
总结:
如果在工作线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。
线程函数:
DWORD WINAPI ThreadProc(
while ( ! bTerminate)
}
主线程中使用CreateThread启动线程。
当想终止子线程时,在主线程中:
bTerminate = TRUE;
WaitForSingleObject(threadHandle, INFINITE);
可是,以运行到WaitForSingleObject,子线程就Crash了。
为什么呢?
问题原因:
后来我终于在InsertItem的反汇编中发现了如下的代码
call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
可见,InsertItem是必须借助消息循环来完成任务的。如果我们在主线程中WaitForSingleObject了,必然导致主线程阻塞,也就导致了消息循环的阻塞,最终导致工作线程Crash掉了*_*
解决方案:
为了解决在主线程中Wait的问题,微软专门设计了一个函数MsgWaitForMultipleObjects,这个函数即可以等待信号(thread,event,mutex等等),也可以等待消息(MSG)。即不论有信号被激发或者有消息到来,此函数都可以返回。呵呵,那么我的解决办法也就出来了。
将上面的WaitForSingleObject用下面的代码替换:
while(TRUE)
总结:
如果在工作线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。
相关文章推荐
- 在界面线程不能使用Sleep和WaitForSingleObject之类的函数, 使用 MsgWaitForMultipleObjects
- 主线程使用WaitForSingleObject和MsgWaitForMultipleObjects等待线程返回值
- 在界面线程不能使用Sleep和WaitForSingleObject之类的函数, 使用 MsgWaitForMultipleObjects
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 关于 CreateEvent 和WaitForMultipleObjects以及 WaitForSingleObject 等函数的使用实例
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用。
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用。
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用。 .
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects) [转载]
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- FW:在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- WaitForSingleObject和WaitForMultipleObjects使用详解
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用
- WaitForSingleObject和WaitForMultipleObjects使用详解