当我的应用程序最小化时,为什么CPU使用会增加?

Sal*_*deh 4 c++ opengl winapi

我正在编写一个计算器.当窗口最大化时,CPU使用率约为12%,但是当它最小化时,CPU使用率上升到大约50%.为什么会发生这种情况?如何防止这种情况发生?以下是我认为导致问题的代码段.

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_ACTIVATE:
    if(!HIWORD(wParam))
        active = true;
    else
        active = false;

    return 0;

case WM_SYSCOMMAND:
    switch(wParam)
    {
    case SC_SCREENSAVE:
    case SC_MONITORPOWER:
        return 0;
    }
    break;

case WM_CLOSE:
    PostQuitMessage(0);
    return 0;

case WM_KEYDOWN:
    if( (wParam >= VK_LEFT && wParam <= VK_DOWN) || wParam == VK_CONTROL)
        myCalc.handleInput(wParam, true);
    return 0;

case WM_CHAR:
    myCalc.handleInput(wParam);
    return 0;

case WM_SIZE:
    ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));  //LOWORD = Width; HIWORD = Height
    return 0;
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int     nShowCmd)
{
MSG msg;

if(!CreateGLWindow(WINDOW_CAPTION, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BPP))
{
    return 0;
}

while(!done)    //Main loop
{
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if(msg.message == WM_QUIT)
            done = true;
        else
        {
            TranslateMessage(&msg); //Translate the message
            DispatchMessage(&msg);  //Dispatch the message
        }
    }
    else
    {
        //Start the time handler
        myTimeHandler.Start();

        //Draw the GL Scene
        if(active)
        {

            DrawGLScene();      //Draw the scene
            SwapBuffers(hDC);   //Swap buffer (double buffering)
        }

        //Regulate the fps
        myTimeHandler.RegulateFps();
    }
}

//Shutdown
KillGLWindow();
return(msg.wParam);
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*mbo 6

我的猜测是你的主循环运行没有任何延迟,如果active是假的.线程无限地旋转通过该循环并使两个处理器核心中的一个保持忙碌(这就是为什么你看到50%的CPU负载).

如果active为true,则交换操作将等待下一个vsync并延迟循环,直到您的下一次屏幕刷新发生,从而导致CPU负载降低.(线程在等待事件发生的Windows函数内等待的时间不计入其CPU负载.)

要解决该问题,您可以在不想呈现任何内容的时间切换到基于GetMessage的消息循环.