我有以下用例:我当前的线程需要执行operation1
,等待一些时间与其他人协调,然后需要做operation2
。 在等待之间,由于文件系统事件,APC可能需要由该线程处理,在当前线程完成operation2
之后,APC将稍后向另一个队列添加另一个operation1
。 简单的如下:
while (true) { processOperation1; SleepEx(..., true); processOperation2; }
重要的是,在operation1
和operation2
之间,必须至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; }