2013-09-25 88 views
0

我有一個手動重置事件來控制(暫停和恢復)while循環。所以在循環中,我必須不斷檢查事件信號狀態在while循環中連續調用WaitForSingleObject是不是很好的做法?

void my_loop() 
{ 
    while(is_ok) 
    { 
     // Check whether event is in signaled state 
     dwWaitResult = WaitForSingleObject( 
      ghEvent, // event handle 
      INFINITE); // indefinite wait 

     switch (dwWaitResult) 
     { 
      // Event object was signaled 
     case WAIT_OBJECT_0: 
      printf("my_loop is working"); 
      break; 

      // An error occurred 
     default: 
      printf("my_loop is halted"); 
      break; 
     } 

    } 
} 

這是一個很好的做法嗎?連續呼叫WaitForSingleObject是否會導致任何問題(CPU,內存......)?

還是有更好的方法來檢查事件狀態在這種情況下?

回答

0

選擇手動重新啓動事件此處會導致循環在事件設置時處於繁忙狀態(100%cpu)。因此,您的代碼中必須有另一部分重置事件,或者您是否忘記重置WAIT_OBJECT_0事件中的事件?

這是一個很好的做法嗎?那麼,當事件沒有設置,這個代碼就在等待(INFINITE)。但是,事件設置後,這只是忙於輪詢事件才能重置。 我懷疑你想在WAIT_OBJECT_0的情況下做其他事情,你想有外部控制。你可以這樣做,在循環中使用WaitForSingleObject沒有問題。

+0

是的,其他函數可以調用ResetEvent和SetEvent來切換事件狀態,從而導致該循環暫停和恢復。不要擔心我的循環在做什麼。我只是問是否調用WaitForSingleObject持續導致任何問題(CPU,內存,...)?或者有沒有更好的方法來檢查事件狀態? – onmyway133

+1

如上所述:_使用WaitForSingleObjectin loop_沒有問題。但是,您也可以查看[關鍵節對象](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530%28v=vs.85%29.aspx)或[同步對象] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686364%28v=vs.85%29.aspx)。 – Arno

+0

您可能還喜歡外部控制循環次數的想法。對於這種方法,您應該查看[信號量對象](http://msdn.microsoft.com/en-us/library/windows/desktop/ms685129%28v=vs.85%29.aspx)。 – Arno