c++ - 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
。
解决方案
如果可能,应避免使用模式 1 和 2,因为两者都会轮询以检查您是否超时。
模式 1 占用 100% cpu,不会处理任何 Windows 消息。
模式 2 仅在收到消息时检查超时,因此它可能会错过一段时间的超时。
相反,您应该考虑使用一个计时器,该计时器会在您没时间时触发。计时器到期时GetMessage
将返回一条消息。WM_TIMER
(我假设IsOutOfTime
只是检查是否已经过去了一段时间)。
推荐阅读
- sql - postgresql:从文本中自动提取字符串
- rest - 如何配置快速服务器以处理 REST 端点以及 socket.io 连接
- python - 如何在循环内将一行附加到熊猫数据帧而不覆盖它
- javascript - 获取最多 'N' 的数组中严格均匀间隔的元素
- c++ - 如何比较 OpenCV 中的两个 Mats 列
- css - CSS Grid - 仅在桌面上的元素交替顺序
- python - 在python中,我可以将日志写入控制台,但不会写入文件
- javascript - 用 JS 脚本突出显示我的复选框的边框
- kotlin - 是否可以让 recyclerview/listview 导航到不同的屏幕?
- java - 如何从首选项同步 getter 和 setter?