从 C++ 代码中禁用 Windows 中的 CPU 程序包空闲状态
Disable CPU package idle states in Windows from C++ code
我正在使用此代码成功禁用 CPU 核心 C 状态(我在 Win10 上工作并使用 Qt):
#include <QCoreApplication>
#include <QDebug>
#include "Windows.h"
extern "C" {
#include "powrprof.h"
}
#pragma comment(lib, "powrprof.lib")
int main()
{
const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
int error;
error = PowerGetActiveScheme(NULL, &scheme);
qDebug() << "PowerGetActiveScheme error code = " << error;
error = PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
qDebug() << "PowerWriteACValueIndex error code = " << error;
error = PowerWriteDCValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
qDebug() << "PowerWriteDCValueIndex error code = " << error;
error = PowerSetActiveScheme(NULL, scheme);
qDebug() << "PowerSetActiveScheme error code = " << error;
return 0;
}
这背后的原因是我是 运行 USB 摄像头,发现当处理器进入空闲模式时我正在丢失数据包。上面的代码工作正常并成功地解决了这个问题。但它实际上有点太多了(禁用所有 C 状态似乎是不必要的)。我用相机的供应商软件进行了一些测试,发现在采集过程中停止的不是核心 C 状态,而是 C 状态包(如果有任何兴趣,我在这里的答案中发布了这个问题的分析https://superuser.com/questions/1648849/monitor-used-usb-bandwidth-in-win10).
所以我的问题是:我可以调整上面的代码以仅禁用包空闲状态吗?如果不可能,我可以有选择地禁用核心 C 状态吗?
更新:
根据@1201ProgramAlarm 的建议,我尝试使用 SetThreadPriority()
作为下面的最小示例:
#include <QDebug>
#include <windows.h>
#include <conio.h>
#include "processthreadsapi.h"
int main()
{
bool ok = false;
ok = SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
qDebug() << "SetPriorityClass ok = " << ok;
ok = SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
qDebug() << "SetThreadPriority ok = " << ok;
for (int i=1;i<100;i++) {
qDebug() << "Here I am in some dummy loop...";
if (_kbhit()) {
break;
}
Sleep(1000);
}
return 0;
}
不幸的是,这没有帮助,在监视 cpu 包空闲状态时(使用 HWiNFO64)我看不到任何效果(包仍然像以前一样空闲)。
系统正在关闭 USB 设备以节省电量。
这个 link 提供了解决方案 USB system power issue。
以管理员身份打开设备管理器。
找到相机。
在“电源管理”选项卡上,取消选择“允许计算机关闭此设备以节省电源”。
如果设备 ID 已知,这可以通过编程方式完成。
我正在使用此代码成功禁用 CPU 核心 C 状态(我在 Win10 上工作并使用 Qt):
#include <QCoreApplication>
#include <QDebug>
#include "Windows.h"
extern "C" {
#include "powrprof.h"
}
#pragma comment(lib, "powrprof.lib")
int main()
{
const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
int error;
error = PowerGetActiveScheme(NULL, &scheme);
qDebug() << "PowerGetActiveScheme error code = " << error;
error = PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
qDebug() << "PowerWriteACValueIndex error code = " << error;
error = PowerWriteDCValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
qDebug() << "PowerWriteDCValueIndex error code = " << error;
error = PowerSetActiveScheme(NULL, scheme);
qDebug() << "PowerSetActiveScheme error code = " << error;
return 0;
}
这背后的原因是我是 运行 USB 摄像头,发现当处理器进入空闲模式时我正在丢失数据包。上面的代码工作正常并成功地解决了这个问题。但它实际上有点太多了(禁用所有 C 状态似乎是不必要的)。我用相机的供应商软件进行了一些测试,发现在采集过程中停止的不是核心 C 状态,而是 C 状态包(如果有任何兴趣,我在这里的答案中发布了这个问题的分析https://superuser.com/questions/1648849/monitor-used-usb-bandwidth-in-win10).
所以我的问题是:我可以调整上面的代码以仅禁用包空闲状态吗?如果不可能,我可以有选择地禁用核心 C 状态吗?
更新:
根据@1201ProgramAlarm 的建议,我尝试使用 SetThreadPriority()
作为下面的最小示例:
#include <QDebug>
#include <windows.h>
#include <conio.h>
#include "processthreadsapi.h"
int main()
{
bool ok = false;
ok = SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
qDebug() << "SetPriorityClass ok = " << ok;
ok = SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
qDebug() << "SetThreadPriority ok = " << ok;
for (int i=1;i<100;i++) {
qDebug() << "Here I am in some dummy loop...";
if (_kbhit()) {
break;
}
Sleep(1000);
}
return 0;
}
不幸的是,这没有帮助,在监视 cpu 包空闲状态时(使用 HWiNFO64)我看不到任何效果(包仍然像以前一样空闲)。
系统正在关闭 USB 设备以节省电量。
这个 link 提供了解决方案 USB system power issue。
以管理员身份打开设备管理器。 找到相机。 在“电源管理”选项卡上,取消选择“允许计算机关闭此设备以节省电源”。
如果设备 ID 已知,这可以通过编程方式完成。