1

a 在典型的无限窗口消息循环中是否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
    }
4

3 回答 3

4

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

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

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

while (GetMessage (&msg, NULL, 0, 0) > 0)
于 2012-06-16T17:35:40.150 回答
2

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

于 2012-06-16T17:36:17.997 回答
1

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

于 2012-06-16T17:47:05.370 回答