尝试在Windows PC上禁用处理器空闲状态(C状态)

mas*_*ash 7 c++ windows cpu perfmon cpu-usage

我需要阻止处理器进入空闲状态(非C0 C状态).不可否认,我对处理器C和P状态知之甚少,所以请耐心等待.我们使用来自第三方供应商的相机,偶尔会提供损坏的帧.供应商已确定当CPU进入空闲状态时,它会干扰火线上框架的传输.为了确认这一点,我在Windows 7 PC上使用了以下代码,实际上,禁用空闲状态解决了这个问题.

   //WIN7
const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
PowerSetActiveScheme(NULL, scheme);
Run Code Online (Sandbox Code Playgroud)

如果我跑我的应用程序并打开Windows permon并添加%C1时,%C2时间和%C3一次我看到他们都是零,当我禁用这些国家,当我让他们,我看到了相当多的时间中度过C3状态(这是在Dell Precision T3500四核PC上).

我还需要在XP上执行此操作,但这些调用在XP上不可用.所以我尝试执行以下操作来禁用空闲状态

  unsigned int ActPwrSch; 
DWORD currPolicy,newPolicy, curr1Policy,curr2Policy, new1Policy, new2Policy;
MACHINE_PROCESSOR_POWER_POLICY Policy; 
if(GetActivePwrScheme(&ActPwrSch)) 
{ 
    if(ReadProcessorPwrScheme(ActPwrSch,&Policy)) 
    { 
        printf("Read Power Scheme:\n"); 
        //if(Policy.ProcessorPolicyAc.DisableCStates!=0) 
        currPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;
        curr1Policy = Policy.ProcessorPolicyAc.Policy[1].AllowPromotion;
        curr2Policy = Policy.ProcessorPolicyAc.Policy[2].AllowPromotion;
        Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = 0;
        Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = 0;
        Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = 0;
        newPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;

        if(WriteProcessorPwrScheme(ActPwrSch,&Policy)) 
        { 
            printf("WriteProcessorPwrScheme succeed\n"); 
            if(SetActivePwrScheme(ActPwrSch,0,0)) 
            { 
                printf("SetActivePwrScheme succeed!!\n");
            } 
        }

    } 
Run Code Online (Sandbox Code Playgroud)

但是当我运行我的应用程序时,我仍然看到处理器花费时间处于C1状态(通过查看perfmon中的相同计数器).我仍然得到我损坏的图像问题.XP PC是单核戴尔optiplex PC.

有谁知道如何防止进入XP上的任何C1-C3状态?正如我所说,似乎我已经在Windows 7上完成了它.

Dyl*_*ole 4

您可以使用 SetThreadExecutionState 函数,该函数使应用程序能够通知系统它正在使用。

编辑:经过一些研究和测试,我找到了一个解决方案,或者我想我做到了。您对于 Windows XP 的选择是正确的。如果您阅读 PROCESSOR_POWER_POLICY 结构的文档,您会发现您可以禁用每个冒犯您的 C 状态:

Policy[0].AllowPromotion = 0; // Disable's C1 (usually C1 won't cause problems, so you should leave it alone.)
Policy[1].AllowPromotion = 0; // Disable's C2
Policy[2].AllowPromotion = 0; // Disable's C3
Run Code Online (Sandbox Code Playgroud)


在 Vista 和 Windows7 中,您不能使用此界面,而是必须执行以下操作:

GUID *scheme;
PowerGetActiveScheme(NULL, &scheme); 
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP,  &GUID_PROCESSOR_IDLE_DISABLE, 1); 
PowerSetActiveScheme(NULL, scheme);
Run Code Online (Sandbox Code Playgroud)


我还没有找到在 Vista 和 Windows 7 上禁用单个 C 状态的方法。如果您需要一些示例代码,请给我发电子邮件,我可以帮助您。