如何使用SleepEx的可靠警报和整体最低睡眠时间?

我有以下用例:我当前的线程需要执行operation1 ,等待一些时间与其他人协调,然后需要做operation2 。 在等待之间,由于文件系统事件,APC可能需要由该线程处理,在当前线程完成operation2之后,APC将稍后向另一个队列添加另一个operation1 。 简单的如下:

 while (true) { processOperation1; SleepEx(..., true); processOperation2; } 

重要的是,在operation1operation2之间,必须至less经过指定的SleepEx时间! 这不需要是一个整体,线程可以立即用于处理APC并排队另一个operation1 ,除非指定的时间已过,否则它不应该继续operation2

从文档 :

如果参数为TRUE,并且调用此函数的线程与调用扩展I / O函数(ReadFileEx或WriteFileEx)的线程相同,则函数在超时时间已过或I / O完成callbackfunction发生。 如果发生I / O完成callback,则调用I / O完成function。 如果一个APC排队到该线程(QueueUserAPC),则该函数在定时器溢出时间已过或调用APC函数时返回。

根据我的理解,这意味着如果SleepEx被调用并且APC已经排队,那么直接由当前线程执行,因为它有这个能力。 但是之后SleepEx之后的代码会发生什么? 线程是否返回到进程operation2是因为SleepEx返回了控制权还是线程回到睡眠状态,在SleepEx停留,直到经过指定的时间量?

文档中的第一句话并不是说从函数返回,而是“恢复线程”:

挂起当前线程直到满足指定的条件。 发生以下情况之一时,执行继续:

这可能意味着线程恢复,处理APC,然后停留在SleepEx ,hibernate所需的任何时间量。

如果情况并非如此,那么SleepEx是否真的离开了,这是否说明已经过了多长时间? SleepEx似乎没有提供该值,但只有一些不变的返回值。 这听起来像我需要在我自己的SleepEx之前和之后需要时间,并一次又一次地调用该函数,直到我真正需要的时间已经过去? 有没有像这样的东西,也许是作为boost一部分?

谢谢!

你应该调用SleepEx进行循环,并处理排队的APC,直到所需的超时时间结束。

像这样的东西。

 for (DWORD dwStart = GetTickCount(); ; ) { DWORD dwElapsed = GetTickCount() - dwStart; DWORD dw = (dwTimeout > dwElapsed) ? (dwTimeout - dwElapsed) : 0; if (!SleepEx(dw, TRUE)) break; }