下面的代码我调试了将近一个星期 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 当想终止子线程时,在主线程中: 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用下面的代码替换: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
|