使程序在无限循环中等待时使用更少的 CPU
Making program use less CPU when waiting in an infinite loop
设置:我有这个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 上输入这个,它正在......难。
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何让LLDB在成功时退出,在失败时等待
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何禁用 CPU 的无序执行
- 提升 ASIO - io_service 不要等待连接到线程
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- C++如何允许等待而不会过多的 CPU 使用率
- 等待() 等待进程是否消耗系统 CPU
- 等待条件变量是否会加载 CPU 内核
- 使程序在无限循环中等待时使用更少的 CPU
- 使用轮询系统调用等待 fds 时 CPU 使用率高
- 如何在等待某些事件时不占用CPU