2013-09-25 28 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

相关问题