下面的代碼我調試了將近一個星期,你能夠看出什麼地方出了問題嗎? DWORD WINAPI ThreadProc(
while ( ! bTerminate) { // 從一個鏈表中讀取信息並且插入到CListCtrl中 // CListCtrl的句柄是通過線程參數傳遞進來的 for (;;) { ReadInfoFromList(); InsertToCListCtrl(); } } } 當想終止子線程時,在主線程中: 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)
{ DWORD result ; MSG msg ; result = MsgWaitForMultipleObjects(1, &readThreadHandle, FALSE, INFINITE, QS_ALLINPUT); if (result == (WAIT_OBJECT_0)) { break; } else { PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); DispatchMessage(&msg); } }
|
在主線程中慎用WaitForSingleObject (WaitForMultipleObjects) --代替方法:MsgWaitForMultipleObjects
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.