【问题标题】:Wait for a specific time in thread, use WaitForSingleObject?在线程中等待特定时间,使用 WaitForSingleObject?
【发布时间】:2012-09-19 05:52:10
【问题描述】:

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

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

【问题讨论】:

  • 请编辑您的问题以包括您使用的平台和语言。我怀疑它是 C++ 和 Win32,但你应该明确。

标签: multithreading winapi timer


【解决方案1】:

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

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

【讨论】:

  • 我这里没有句柄,我只想等一个时期。
【解决方案2】:

正确的方法很大程度上取决于您对to wait some time 的含义。 Sleep functionWaitForSingleObject function 的精度基本相同。 根据底层硬件和操作系统的版本,可实现的最小延迟在 0 .. 1 .. 20 毫秒的范围内。如果您只想等待几秒钟或十分之一秒,这两个功能是正确的选择。

等待更短的时间,即毫秒范围内需要更详细的调查。请参阅thisthis 答案了解更多详情。

【讨论】:

    【解决方案3】:

    如果您只想让线程等待固定的时间,请使用Sleep()。但是如果你想让等待被一些外部操作中断,你必须等待一些东西,无论是一个计时器(见SetTimer()Get/PeekMessage()),一个事件(见CreateEvent()WaitForSingleObject()),线程队列中的消息(参见PostThreadMessage()MsgWaitForMultipleObjects())、I/O 完成端口回调(参见PostQueuedCompletionStatus()GetQueuedCompletionStatus())等

    【讨论】:

      【解决方案4】:

      如果你想阻塞一个线程并等到特定时间,你可以使用CreateWaitableTimer()函数,然后在定时器句柄上使用WaitForSingleObject()

      这个函数也可以等待一个特定的时间,WaitForMultipleObjects()会让你阻塞直到定时器间隔和其他对象同时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-14
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        相关资源
        最近更新 更多