c++ - CPU 使用率高的 Win32 应用程序

标签 c++ windows winapi visual-c++

这是我第一次使用 Windows 应用程序,我有点沮丧。我只有一个创建 Win32(Visual C++) GUI 应用程序的简单代码,但是一旦我启动可执行文件,我的 CPU 就会上升到 30%(超过应用程序),在我解决这个问题的搜索中,我发现有人说在消息循环(GetMessage 或 PeekMessage)中休眠 10 毫秒可以解决这个问题,而且确实如此。但由于我真的不喜欢突然休眠我的代码,而且这是一个事件处理程序循环,所以我很乐意解释如何解决这个问题。

“麻烦的地方”一瞥。

while (TRUE) {
    if (PeekMessage(&g_Msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&g_Msg); // translate keystroke messages into the right format
        DispatchMessage(&g_Msg); //Send the message to the WindowProc function
        if (g_Msg.message == WM_QUIT)
            break;
    } else {
        // Run d3d code here
    }
    // Sleep(1); REDUCES CPU!
}

提前致谢

卡约格德斯

最佳答案

标准的 Windows 应用程序循环使用 GetMessage。 GetMessage 会一直阻塞,直到应用程序中有输入或某些东西需要运行。

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

您编写的代码适合游戏 - 当您希望 DirectX 尽可能快地渲染帧,同时仍为其他进程内窗口和 Win32 API 发送消息时。当您以这种方式编码时,您所编码的实际上是在使用整个 CPU 核心。 (如果你有一个四核 CPU,你至少使用了 25%,所以 30% 的测量似乎是准确的)。

周期性的Sleep(0)Sleep(1) 语句对于让您的主线程屈服于其他线程和进程很有用。您会牺牲一点帧速率,但如果游戏有其他线程用于网络和声音,有时这是必要的。但由于您拥有多核 CPU,因此您可能不需要这样做,因为其他内核可以为这些线程提供服务。

在过去,在超线程和多核出现之前,执行 Sleep 语句是不占用全部资源的正常方法。它允许 Windows 上的其他后台应用程序能够运行。

关于c++ - CPU 使用率高的 Win32 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948837/

相关文章:

c++ - 无法理解arduino示例代码的语法

windows - CMD Findstr 与 ping

python - Windows 上带有 --noconsole 的 pyinstaller 根本无法工作

c++ - 参数问题帮助

c++ - Pthreads 和信号 C++

c++ - C++ 中的 "new"关键字有什么问题?

c# - 单击时捕获并保存屏幕截图 - Windows C#

c++ - 何时使用 DLL_PROCESS_VERIFIER 标志调用 DllMain?

c++ - 无效的属性分配 : "displayText" is a read-only property in TextField qml

c - 如何用c获取主板的uuid