8

プロセッサーがアイドル状態 (非 C0 C 状態) にならないようにする必要があります。確かに、私はプロセッサ C と P の状態についてあまり知らないので、ご容赦ください。破損したフレームを時折配信するサードパーティ ベンダーのカメラを使用しています。ベンダーは、CPU がアイドル状態になると、firewire を介したフレームの送信に干渉すると判断しました。これを確認するために、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);

アプリケーションを実行して 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");
            } 
        }

    } 

ただし、アプリケーションを実行すると、プロセッサが C1 状態で時間を費やしていることがわかります (perfmon で同じカウンターを調べると)。そして、私はまだ破損した画像の問題を抱えています。XP PC は、シングル コアの Dell optiplex PC です。

XP で C1 ~ C3 状態に入るのを防ぐ方法を知っている人はいますか? 私が言ったように、私はWindows 7でそれをやったようです.

4

3 に答える 3

3

アプリケーションが使用中であることをシステムに通知できるようにする 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


Vista および Windows7 では、このインターフェイスを使用できません。代わりに、次のようにする必要があります。

GUID *scheme;
PowerGetActiveScheme(NULL, &scheme); 
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP,  &GUID_PROCESSOR_IDLE_DISABLE, 1); 
PowerSetActiveScheme(NULL, scheme);


Vista と Windows 7 で個別の C ステートを無効にする方法が見つかりませんでした。サンプル コードが必要な場合は、メールでお問い合わせください。

于 2012-03-15T14:26:03.730 に答える
2

これは私のために働いているようです:

void PowerState(bool bEnable)
{
    // CPU idle state
    unsigned int ActPwrSch;
    MACHINE_PROCESSOR_POWER_POLICY Policy;
    if (GetActivePwrScheme(&ActPwrSch))
    {
        if (ReadProcessorPwrScheme(ActPwrSch, &Policy))
        {
            Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = bEnable ? 1: 0; // C1
            Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = bEnable ? 1: 0; // C2
            Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = bEnable ? 1: 0; // C3
            if (WriteProcessorPwrScheme(ActPwrSch, &Policy))
                SetActivePwrScheme(ActPwrSch, 0, 0);
        }
    }
    OSVERSIONINFO osvi;
    memset(&osvi, 0, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    // For Vista and above
    if (osvi.dwMajorVersion >= 6)
    {
        static const GUID processor_idle_disable_guid = {0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad};
        GUID *scheme;
        PowerGetActiveScheme(NULL, &scheme);
        PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &processor_idle_disable_guid, bEnable ? 0 :  1);
        PowerSetActiveScheme(NULL, scheme);
    }
}
于 2012-03-16T03:25:50.237 に答える
2

5 分ごとに数学的計算を実行する TSR は、アイドル状態を防ぐことができるでしょうか? または、定義された間隔でマウス移動信号を送信する安価なハードウェアまたはソフトウェア マウス エミュレーターを購入することもできます。

于 2012-09-11T12:04:50.343 に答える