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

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

重要的是,在operation1operation2之间,至少要经过指定的时间才能到达SleepEx!那不需要成一个整体,该线程可以立即用于处理APC并排队另一个operation1,除非经过指定的时间量,否则它不应继续operation2

docs:



根据我的理解,这意味着如果SleepEx被调用并且APC已排队,则它可以被当前线程直接执行,因为它可以执行此操作。但是,之后SleepEx之后的代码会发生什么呢?是因为operation2返回了控制权,线程还是返回进程SleepEx?还是线程回到 sleep 状态,一直停留在SleepEx中,直到经过了指定的时间?

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



这可能意味着该线程将恢复,处理APC,然后停留在SleepEx中,并在需要的任何时间 sleep 。

如果不是这种情况,并且确实保留了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;
}

关于c++ - 如何在具有警报性的真实且总体上最短的 sleep 时间下使用SleepEx?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46220843/

10-12 03:57