避免在等待输入时浪费 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 周期。
我的程序正在等待按下 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 周期。