等待线程中的特定时间,使用WaitForSingleObject?

时间:2012-09-19 05:52:11

标签: multithreading winapi timer

我需要在我的一个线程中等待一段时间,我开始考虑WaitForSingleObject但它需要句柄来等待,尽管它可能需要超时输入;

另一个解决方案可能会使用SetTimer,但它似乎会创建WM_TIMER消息但我没有更改来捕获该消息,因为我在一个线程中,所以有什么我可以使用这里 ?我可以使用Sleep吗?

4 个答案:

答案 0 :(得分:3)

WM_TIMER不太可靠。它是一个低优先级的Windows消息,如果用户正在调整窗口大小,则不会发送该消息(例如)。

我会说"睡眠"是最好的选择,但在过去我使用WaitForSingleObject,因为它允许我传入一个句柄来取消等待操作,如果我需要。取决于你的设计。

答案 1 :(得分:2)

正确的方法很大程度上取决于您对to wait some time的意思。 Sleep functionWaitForSingleObject function基本上具有相同的准确度。 取决于底层硬件和OS的版本,可实现的最小延迟在0 ... 1 ... 20ms的范围内。如果您希望等待几秒或十秒,这两个功能是正确的选择。

等待更短的时间,即在毫秒范围内需要更详细的调查。有关详细信息,请参阅thisthis答案。

答案 2 :(得分:1)

如果您只想让线程等待一段固定的时间,请使用Sleep()。但是如果你希望某些外部操作可以中断等待,你必须等待一些事情(参见SetTimer()Get/PeekMessage()),这是一个事件(见CreateEvent()WaitForSingleObject()),线程队列中的消息(请参阅PostThreadMessage()MsgWaitForMultipleObjects()),I / O完成端口回调(请参阅PostQueuedCompletionStatus()GetQueuedCompletionStatus())等等。

答案 3 :(得分:0)

如果要阻止线程并等到特定时间,可以使用CreateWaitableTimer()函数,然后在计时器句柄上使用WaitForSingleObject()

此功能也可以等待一段特定的时间段,WaitForMultipleObjects()会让你阻止,直到定时器间隔和其他对象同时进行。