乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      在用戶線程/主線程中推薦MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()函數(shù)

       wtkc 2014-11-20

      在多線程編程中,通常都需要線程間的同步,一個線程要等待另一個線程的事件才繼續(xù)執(zhí)行,一般的做法是采用WaitForSingleObject和WaitForMultipleObjects()函數(shù)來實現(xiàn)。
      但在實際的應(yīng)用中,經(jīng)常出現(xiàn)等待線程卡死的狀況,也就是說等待的事件一直無效。為什么事件一直無效呢?很多的情況是等待線程阻塞了另外的線程,使另外的線程無法設(shè)置事件有效。為什么會阻塞呢?原因就比較多了,需要具體問題具體分析。

       WaitForSingleObject和WaitForMultipleObjects()都是阻塞函數(shù),事件無效就一直不返回,從而阻塞該線程,使該線程無法處理其他的事務(wù),如果其他的線程發(fā)送消息過來,將得不到處理而不返回,從而將其他的線程也阻塞,造成相互等待,這就是臭名昭著的“死鎖”?。?!

        微軟提供了另外一個函數(shù)可以解決該問題,它就是MsgWaitForMultipleObjects()函數(shù),該函數(shù)不但可以等待事件,還可以等待消息,從而處理消息,使線程不阻塞。該函數(shù)的具體解釋前參考MSDN或網(wǎng)絡(luò)。

      一般的使用方法為:

      1. DWORD dwRet = 0;    
      2. MSG msg;  
      3. DWORD dwStartTime = GetTickCount();   
      4. while (TRUE)    
      5.   {   
      6. //超時判斷  5s  
      7.                dwRet = GetTickCount() - dwStartTime;  
      8. if ((GetTickCount() - dwStartTime) > 10000)  
      9. {  
      10. AfxMessageBox(_T("獲取數(shù)據(jù)超時,請檢測設(shè)備網(wǎng)絡(luò)連接!"), MB_OK | MB_ICONERROR);  
      11. return NULL;  
      12. }  
      13.   
      14. //wait for m_hThread to be over,and wait for    
      15. //QS_ALLINPUT(Any message is in the queue)   
      16.                //dwRet = WaitForSingleObject(g_hRetEvent, INFINITE);  
      17. dwRet = MsgWaitForMultipleObjects (1, &g_hRetEvent, FALSE, 100, QS_ALLINPUT);    
      18.   switch(dwRet)    
      19. {    
      20. case WAIT_OBJECT_0: //返回數(shù)據(jù)達到  
      21. break; //break the loop    
      22. case WAIT_OBJECT_0 + 1: //界面消息  
      23. //get the message from Queue    
      24.   //and dispatch it to specific window    
      25. if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  
      26. {  
      27. TranslateMessage(&msg);  
      28. DispatchMessage(&msg);     
      29. }  
      30. continue;   
      31. case WAIT_TIMEOUT: //超時  
      32. continue;  
      33. default:   
      34.   AfxMessageBox(_T("數(shù)據(jù)獲取失敗,未知錯誤!"), MB_OK | MB_ICONERROR);  
      35.   return NULL;  
      36. break; // unexpected failure    
      37. }   
      38.   break;  
      39. }  

      特別是在主線程和界面線程中推薦使用該函數(shù),可以避免很多麻煩!?。?/p>

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多