C++ 函数在 while(GetMessage(...)){...} 中不起作用

标签 c++ winapi while-loop sendmessage

我真的很可笑。我在做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;
}

模式 2

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 下不工作。

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

如果我在 while (1) {...} 中提供 Sleep(...),我可以减少 CPU 负载,但我讨厌像这样的编码风格这个。

1.模式 1模式 2 之间有什么本质区别。
2.我是否误用了模式 2
3. 如何在不使用 sleep 的情况下降低 CPU 负载。

最佳答案

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

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

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

关于C++ 函数在 while(GetMessage(...)){...} 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51039338/

相关文章:

c++ 从函数返回对象?

c - win32编程中的资源和控制位置

c - 使用多线程优化硬盘读写功能的速度

c - 使用 Win32 API 实现流畅的动画 - 无需控制消息泵

c++ - C++ 中的 While 循环没有大括号和括号中的函数调用?

c++ - 字符串 vector 到 istringstream

c++ - 编译器如何知道字符串文字(const char*)已经存在于数据存储器中?

c++ - 在 Netbeans IDE 8.0.2 中使用(低于分数) "_"

java - 为什么 boolean 变量会阻止打印我的 else 语句?

python - 为 tf.while_loop 的每个时间步计算梯度