避免在等待输入时浪费 CPU 个周期

Avoiding wasted CPU cycles while waiting for input

我的程序正在等待按下 F4 热键以退出。

我打电话给 Sleep(1) 因为没有这个,我用了我 CPU 的 18%。这是正确的方法吗?我的直觉告诉我有更好的方法。

我知道键盘输入是基于中断的,但是有没有办法让线程休眠直到注册键盘状态更改?

#include <Windows.h>
#include <iostream>
#include <thread>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

    while (!(GetAsyncKeyState(VK_F4) >> 15)) {
        Sleep(1);  // Sleep for 1 ms to avoid wasting CPU
    }
    return 0;
}

关注RegisterHotKey, UnRegisterHotkey, GetMessage, TranslateMessage and DispatchMessage喜欢

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{

    RegisterHotKey(0, 1, MOD_NOREPEAT, VK_F4);
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0) != 0)      // TODO: error handling
    {
        if (msg.message == WM_HOTKEY)
        {
            if (msg.wParam == 1) {
                break;
            }
        }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    UnregisterHotKey(0, 1);
    return 0;
}

GetMessage() 将阻塞,直到收到 window 消息,该消息将其唤醒。获取 Process Explorer 的副本,查看进程详细信息,发现它在等待时没有使用单个 CPU 周期。