欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在主線(xiàn)程中慎用WaitForSingleObject (WaitForMultipleOb...

下面的代碼我調試了將近一個(gè)星期

,你能夠看出什么地方出了問(wèn)題嗎?

線(xiàn)程函數:

DWORD WINAPI ThreadProc(
    
while(!bTerminate)
    
{
        
// 從一個(gè)鏈表中讀取信息并且插入到CListCtrl中
        
// CListCtrl的句柄是通過(guò)線(xiàn)程參數傳遞進(jìn)來(lái)的
        for(;;)
       
{
           ReadInfoFromList();
           InsertToCListCtrl();
        }

    }

}
主線(xiàn)程中使用CreateThread啟動(dòng)線(xiàn)程。

當想終止子線(xiàn)程時(shí),在主線(xiàn)程中:
bTerminate = TRUE;
WaitForSingleObject(threadHandle, INFINITE);
可是,以運行到WaitForSingleObject,子線(xiàn)程就Crash了。

為什么呢?

問(wèn)題原因:
后來(lái)我終于在InsertItem的反匯編中發(fā)現了如下的代碼
call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
可見(jiàn),InsertItem是必須借助消息循環(huán)來(lái)完成任務(wù)的。如果我們在主線(xiàn)程中WaitForSingleObject了,必然導致主線(xiàn)程阻塞,也就導致了消息循環(huán)的阻塞,最終導致工作線(xiàn)程Crash掉了*_*

解決方案:
為了解決在主線(xiàn)程中Wait的問(wèn)題,微軟專(zhuān)門(mén)設計了一個(gè)函數MsgWaitForMultipleObjects,這個(gè)函數即可以等待信號(thread,event,mutex等等),也可以等待消息(MSG)。即不論有信號被激發(fā)或者有消息到來(lái),此函數都可以返回。呵呵,那么我的解決辦法也就出來(lái)了。
將上面的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, 00, PM_REMOVE);
        DispatchMessage(
&msg); 
    }
 
}


總結:
如果在工作線(xiàn)程中有可能涉及到了消息驅動(dòng)的API,那么不能在主線(xiàn)程中使用WaitForSingleObject一類(lèi)函數,而必須使用上述的方案。

posted on 2004-07-15 20:22 shootingstars 閱讀(13629) 評論(26)  編輯 收藏 網(wǎng)摘 所屬分類(lèi): C++

評論

#1樓  2004-09-17 11:38 HXY [未注冊用戶(hù)]

謝謝你的文章!

  回復  引用    

太強了,解決了困擾我一整天的問(wèn)題?。?!
  回復  引用    


作者你好,

消息循環(huán)只負責獲取消息隊列中的消息 ,
SendMessageA的消息并不進(jìn)入消息隊列


  回復  引用    

看了你的文章后,問(wèn)題解決,非常感謝。
  回復  引用    

您好!我對你寫(xiě)的內容好奇,于是我就按照你的做法在windows32的console程序,
并沒(méi)有出現你說(shuō)的事情,線(xiàn)程依然很好干了他該干的事。我想可能是你搞錯了,導致死鎖了吧。

  回復  引用    

#6樓 [樓主] 2006-01-17 10:10 shootingstars      
To wuzq
不知道你是如何做的測試,能夠把測試代碼貼出來(lái)嗎?

  回復  引用  查看    

#7樓 [樓主] 2006-01-17 10:37 shootingstars      
To world
SendMessageA發(fā)送的消息確實(shí)不進(jìn)入消息循環(huán),但是這個(gè)過(guò)程是在主線(xiàn)程的上下文中完成的,還是在開(kāi)的線(xiàn)程中完成的?
呵呵,有空再研究研究,或許原理還是有問(wèn)題。

  回復  引用  查看    

console不會(huì )是因為他沒(méi)有消息循環(huán)的原因吧。猜想你的程序可能是創(chuàng )建一個(gè)線(xiàn)程之后就讓它在console停在那里了對吧,這是正常的,但是在有窗口消息的程序中就不行了。
我是一個(gè)初學(xué)者,有VC高手希望能交個(gè)朋友。
我的E-MAIL:puma-ly@163.com

  回復  引用    

#9樓  2006-03-28 16:27 za [未注冊用戶(hù)]
非常感謝?。?!,
  回復  引用    

解決了我2天百思不得其解的問(wèn)題, 謝謝.
  回復  引用    

#11樓  2006-11-27 09:21 cm [未注冊用戶(hù)]
謝謝!幫我解決了一個(gè)問(wèn)題
  回復  引用    

#12樓  2006-11-27 09:21 cm [未注冊用戶(hù)]
謝謝!幫我解決了一個(gè)問(wèn)題
  回復  引用    

#13樓  2006-11-27 09:21 cm [未注冊用戶(hù)]
謝謝!幫我解決了一個(gè)問(wèn)題
  回復  引用    

直接把for(;;)去掉就可以了吧。那樣while循環(huán)條件不成立時(shí)函數就返回了,WaitForSingleObject也就返回了。
  回復  引用    

SendMessage的目標窗口如果屬于另一個(gè)線(xiàn)程,則會(huì )發(fā)生線(xiàn)程上下文切換,等待另一線(xiàn)程處理完成消息。為了防止另一線(xiàn)程當掉,導致SendMessage永遠不能返回,我們可以調用SendMessageTimeout函數

 

  回復  引用    

太感謝了,困擾我好幾個(gè)禮拜的問(wèn)題啊....

不過(guò)在WaitForSingleObject的第二個(gè)參數設置成一個(gè)數值也可以避免出問(wèn)題,不過(guò)沒(méi)有樓主的效果好~

  回復  引用    

我要在主線(xiàn)程中開(kāi)啟一個(gè)UI線(xiàn)程,該UI線(xiàn)程查找某種設備,所以主線(xiàn)程要阻塞,一直到UI線(xiàn)程結束,我該怎么辦呢
  回復  引用    

#18樓 [樓主] 2007-10-08 13:29 shootingstars      
To zhcen
你的主線(xiàn)程不是一個(gè)UI線(xiàn)程嗎?
我的建議是:在UI線(xiàn)程中等待某個(gè)事件發(fā)生一定使用MsgWaitForMultipleObjects,不要使用WaitForMultipleObjects。

  回復  引用  查看    

是你自己字線(xiàn)程本身代碼有問(wèn)題,不是WaitForSingleObject的錯
for沒(méi)辦法退出,怎么WaitForSingleObject?

  回復  引用    

你好,看了你的代碼后對我幫助很大,但同時(shí)也發(fā)現了個(gè)很奇怪的問(wèn)題。
在debug版本下面正常運行
但如果在release版本下,你的等待那個(gè)函數
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);
}
}
好像就沒(méi)起作用了。
我估計是不是函數的返回值有問(wèn)題。。。不太清楚,希望你能幫忙看下,
謝謝??!

  回復  引用    

微軟的文檔寫(xiě)得清清楚楚啦,凡是創(chuàng )建窗口的線(xiàn)程必須謹慎使用該函數!
  回復  引用    

LZ看了你的文章后有些疑惑的,

1. 的線(xiàn)程代碼中的 for(;;){
ReadInfoFromList();
InsertToCListCtrl();
}
好像沒(méi)有必要要for(;;){}這一層吧,這樣的話(huà)你的while(!bTerminate)就沒(méi)有什么意義了,永遠沒(méi)法執行到吧,

2. result = MsgWaitForMultipleObjects(1, &readThreadHandle, FALSE, INFINITE, QS_ALLINPUT); 如果你用INFINITE永遠等待不超時(shí)后面的代碼在在等待的時(shí)間沒(méi)有發(fā)生的情況下還能執行到嗎?

  回復  引用    

太感謝了!
  回復  引用  查看    

22樓白癡。
回答你
1,人家那是簡(jiǎn)寫(xiě)。難道樓主故意寫(xiě)個(gè)死循環(huán)在那么?

2,你根本就沒(méi)看懂。人家說(shuō)是有消息來(lái)也可以往下執行。知道什么是有消息么?

  回復  引用    

樓主搞錯了。
CListCtrl 只能在主線(xiàn)程操作。
WaitForSingleObject 沒(méi)問(wèn)題。

  回復  引用    

WaitForSingleObject(threadHandle, INFINITE);中INFINITE改為0也可以返回的。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
線(xiàn)程函數的設計以及線(xiàn)程同步要點(diǎn)(MsgWaitForMultipleObjects等)
在用戶(hù)線(xiàn)程/主線(xiàn)程中推薦MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()函數
線(xiàn)程啟動(dòng)后界面假死的故障排除
WaitForSingleObject函數的使用
轉來(lái)的
多線(xiàn)程同步-event
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久