我有以下用例:我当前的线程需要执行operation1
,等待一段时间与他人协调,然后需要执行operation2
。在等待之间,由于文件系统事件,该线程可能需要对该APC进行处理,这会在当前线程完成operation1
之后向另一个队列中添加另一个operation2
,以便稍后进行处理。如下所示的简单内容:
while (true)
{
processOperation1;
SleepEx(..., true);
processOperation2;
}
重要的是,在
operation1
和operation2
之间,至少要经过指定的时间才能到达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/