【问题标题】:Sleep() in windows message loop?Windows消息循环中的睡眠()?
【发布时间】:2012-06-16 17:33:37
【问题描述】:

Sleep(sometime) 在典型的无限窗口消息循环中是否有用,还是只是无用甚至有害?

一些示例包含Sleep,但大多数不包含。

    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        Sleep(500); // As pointed out below, completely nonsense
        Sleep(5); // Would have been the better example, but still bad
    }

【问题讨论】:

    标签: c++ winapi sleep message-loop


    【解决方案1】:

    那个电话毫无意义。 GetMessage 一直等到队列中有消息,当它出现时,您的程序不会占用 CPU。没有必要尝试做它已经做的事情。

    现在关于有害,也许(非常可能)它会!如果队列中有 1000 条消息,它将休眠 500 秒,然后才能处理所有消息。在那段时间里,您将积累超过 1000 条消息。用不了多久,您的窗户就会变得完全无用。 Windows 确实收到很多消息。你会告诉我每次鼠标在窗口上移动根本时你会等待半秒响应?

    此外,从documentation 开始,GetMessage 将在出现错误时返回 -1。由于 -1 不是 0,因此您的循环无论如何都会尝试处理该消息。更正确的方法是要么放入处理程序,要么完全退出:

    while (GetMessage (&msg, NULL, 0, 0) > 0)
    

    【讨论】:

    • “你要告诉我,每次鼠标在你的窗口上移动时你会等待半秒来响应?”不,我只是在问 ;-) 是的,这个例子很愚蠢,但我在一些代码中发现了这一点。
    【解决方案2】:

    Sleep() 调用既完全无用又有害。 GetMessage() 已经让你的线程休眠,直到你的一个窗口准备好一条消息。添加Sleep(500) 只会使您的窗口无响应,因为它们每秒只会处理两条消息。

    【讨论】:

      【解决方案3】:

      当您的应用程序不工作时,Windows 工作。您甚至不需要了解这方面的技术:您发布的示例代码相当于当电话响起时客户服务代表正在工作中睡觉。删除Sleep()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        相关资源
        最近更新 更多