从 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 已知,这可以通过编程方式完成。