为while循环创建超时的最简洁方法是什么?

T.T*_*.T. 7 c c++ windows algorithm winapi

Windows API/C/C++

1. ....  
2. ....
3. ....    
4.    while (flag1 != flag2)
5.    {
6.      SleepEx(100,FALSE);   
        //waiting for flags to be equal (flags are set from another thread).
7.    }
8. .....
9. .....  
Run Code Online (Sandbox Code Playgroud)

如果标志在7秒后不相等,我想继续第8行.

任何帮助表示赞赏.谢谢.

Jar*_*Par 10

如果您正在等待设置特定标志或达到时间,则更清洁的解决方案可能是使用自动/手动重置事件.这些设计用于线程之间的信令条件,并且具有在其上设计的非常丰富的API.例如,您可以使用WaitForMultipleObjects API,它采用显式超时值.


Mic*_*ael 6

不要轮询要更改的标志.即使在循环期间出现睡眠或产量,这也只会浪费CPU周期.

相反,获取设置标志的线程会发出信号通知您已经更改过,可能是使用了一个事件.你等待事件需要超时,你可以调整以允许等待7秒.

例如:

Thread1:

 flag1 = foo;
 SetEvent(hEvent);


 Thread2:

 DWORD timeOutTotal = 7000;  // 7 second timeout to start.
 while (flag1 != flag2 && timeOutTotal > 0)
 {
     // Wait for flags to change
     DWORD start = GetTickCount();

     WaitForSingleObject(hEvent, timeOutTotal);

     DWORD end = GetTickCount();

    // Don't let timeOutTotal accidently dip below 0.
    if ((end - start) > timeOutTotal)
    {
        timeOutTotal = 0;
    }
    else
    {
       timeOutTotal -= (end - start);
    }

 }
Run Code Online (Sandbox Code Playgroud)