下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?
线程函数:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205358723-680104428.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205358907-1439840528.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205359107-1581186696.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205359328-131423212.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205359517-1606611004.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205359730-800346292.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205359924-757801144.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205400147-92090118.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205400341-1244849491.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205400523-1386059089.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205400749-2085269106.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205400966-173588590.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205401158-352756825.png)
当想终止子线程时,在主线程中:
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用下面的代码替换:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205401386-213347993.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205401589-1558760636.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205401853-706555276.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205402041-952076071.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205402266-1397758885.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205402451-1387536001.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205402632-1098685783.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205402835-77160931.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205403025-857068339.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205403224-406494920.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205403462-156898889.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205403642-1181216683.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205403813-462999038.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205404007-1993417993.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205404270-236998304.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205404503-202961015.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205404748-331680012.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205404956-770328039.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205405139-556896857.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180828205405348-54611059.png)
总结:
如果在工作线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。