具有高CPU使用率的Win32应用程序

时间:2015-11-27 00:36:37

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

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

查看"麻烦的地区"。

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!
}

提前致谢

Caio Guedes

2 个答案:

答案 0 :(得分:2)

标准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上的其他后台应用程序能够运行。

答案 1 :(得分:-1)

你应该使用GetMessage(),它是一个阻塞功能。它会阻塞,直到有东西需要处理。