使程序在无限循环中等待时使用更少的 CPU

Making program use less CPU when waiting in an infinite loop

本文关键字:CPU 等待 程序 无限循环      更新时间:2023-10-16

设置:我有这个c++程序:

#include <windows.h>
using namespace std;
int main(){
    HWND window;
    AllocConsole();
    window = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(window,0);
while (1){  
if (GetKeyState('A'))
        {
    system("start love.mp3");
    return 0;
        }
    }
return 0;
}

因此,程序作为一个进程运行,并等待直到按下键 A。然后它播放爱.mp3文件:)

但是,当程序等待时,它会占用 25% 的 CPU 使用率。

:有没有办法减少这种情况,这样程序就不会消耗太多的CPU?

你的程序犯了忙于等待的罪。

尝试使用 SetWindowsHookEx 挂接键盘呼叫。

在循环中调用Sleep是有效的,但 IMO,这显然是错误的方式。

相反,我会做一个阻塞读取,然后检查结果是否A,并在它出现时做你的事情:

while ((ch = getch()) != EOF)
    if (ch == 'A') {
        system("start love.mp3");
        break;
    }

这不会错过击键,并且它使用的 CPU 时间甚至比调用 Sleep 的循环还要少。

你可以很容易地将Windows Sleep()函数的调用插入循环中。参数以毫秒为单位,因此每秒大约检查键盘五次:

#include <windows.h>
// ...
while (1){  
    if (GetKeyState('A'))
    {
        system("start love.mp3");
        return 0;
    }
    Sleep(200);
}

执行此操作的正确方法是使用 Windows 挂钩,可能是 WH_KEYBOARD 或 WH_KEYBOARD_LL 钩子的类型(尽管WH_GETMESSAGE也可以工作)并在那里进行处理。

查看 SetWindowsHookEx 的文档,网址为 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

我还没有测试过这个 - 只是在飞行中鞭打它 - 但这里有一个简单的例子,当按下"A"键时,它应该做你想要的。

LRESULT __stdcall CALLBACK LoveProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    static int love = 0;
    if((nCode == HC_ACTION) && 
       (wParam == 'A') &&      /* the key pressed was 'A' */
       (lParam & 0x40000000))  /* trigger when the key is pressed */
    {        
        if(love == 0)
            play_romantic_love_song();
        /* but don't overdo it because "Too Much Love Will Kill You" */
        love = 1;
    }
    return CallNextHookEx(hOldKeyHook, nCode, wParam, lParam );
}

您可能还想在谷歌上搜索"*SetWindowsHookEx WH_KEYBOARD*",因为我非常确定至少有几篇文章在CodeProject上解释了这一点。我会包含链接,但我是从我的 iPhone 上输入这个,它正在......难。