首页 > 解决方案 > C++ 函数在 while(GetMessage(...)){...} 中不起作用

问题描述

我真的很可笑。当我在做 C++ 编程时,需要等待很长时间。所以我决定使用while(){...}.

模式1:如果我使用while (1) {...}
CPU将处于最大负载下。(它在一个 CPU 上占用最大负载。)

模式二:

while(GetMessage(&msg, NULL, 0, 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

会减少CPU的负载。但是,和
之间的语句执行有很大的不同。while(1){...}while(GetMessage(&msg, NULL, 0, 0)){...}

例如,

模式一

dwEndTime = time(NULL) + 120;
while(1)
{
    if(IsOutOfTime())
        break;
}

模式二

dwEndTime = time(NULL) + 120;
while(GetMessage(&msg, NULL, 0, 0)
{
    if(IsOutOfTime())
        break;

    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

实施IsOutOfTime()

BOOL IsOutOfTime()
{
    if(time(NULL) >= dwEndTime)
        return TRUE;

    return FALSE;
}

导致不同的执行结果。break不在模式 2 下工作。

有人请帮我解决这个问题。

如果我让步Sleep(...)while (1) {...}我可以减少 CPU 负载,但我讨厌这样的编码风格。

1.模式一模式二有什么本质区别。
2.我误用了模式 2吗?
3.如何减少不使用的CPU负载sleep

标签: c++winapiwhile-loopsendmessage

解决方案


如果可能,应避免使用模式 1 和 2,因为两者都会轮询以检查您是否超时。

模式 1 占用 100% cpu,不会处理任何 Windows 消息。
模式 2 仅在收到消息时检查超时,因此它可能会错过一段时间的超时。

相反,您应该考虑使用一个计时器,该计时器会在您没时间时触发。计时器到期时GetMessage将返回一条消息。WM_TIMER(我假设IsOutOfTime只是检查是否已经过去了一段时间)。


推荐阅读