2011-07-15 11 views
0

入力に追いつかない従来のVisual Studio win32 un-managed C++アプリケーションで問題を解決しようとしています。私の解決策の一環として、私はクラスとスレッドの優先順位をバンプすることを検討しています。XPアプリケーションでCPU使用率が増加しない

私のPCには、64ビットXPを実行する4つのxeonプロセッサが搭載されています。私は、4つのバックグラウンドループスレッドを作成する短いwin32テストアプリを作成しました。それぞれのスレッドは、それぞれ独自のプロセッサで実行されています。いくつかのコードサンプルを以下に示します。問題は、私が極端に優先順位をつけたとしても、CPU使用率は依然として1%以下です。

私のテストアプリケーションは32ビットで、WOW64で動作します。同じテストアプリケーションでは、32ビットxpマシンで1%未満のCPU使用率も使用されます。私は両方のマシンの管理者です。これを動作させるには他に何が必要ですか?あなたはそれが実際にCPU時間を食べたい場合は

DWORD __stdcall ThreadProc4 (LPVOID) 
{ 
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); 
    while (true) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      int p = i; 
      int red = p *5; 
      theClassPrior4 = GetPriorityClass(theProcessHandle); 
     } 
     Sleep(1); 
    } 
} 

int APIENTRY _tWinMain(...) 
{ 
... 
    theProcessHandle = GetCurrentProcess(); 
    BOOL theAffinity = GetProcessAffinityMask(
     theProcessHandle,&theProcessMask,&theSystemMask); 

    SetPriorityClass(theProcessHandle,REALTIME_PRIORITY_CLASS); 

    DWORD threadid4 = 0; 
    HANDLE thread4 = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 
     0, 
     (LPTHREAD_START_ROUTINE)ThreadProc4, 
     NULL, 
     0, 
     &threadid4); 

    DWORD_PTR theAff4 = 8; 
    DWORD_PTR theAf4 = SetThreadAffinityMask(thread1,theAff4); 
    SetThreadPriority(thread4,THREAD_PRIORITY_TIME_CRITICAL); 
    ResumeThread(thread4); 
+2

問題は、アプリケーションがCPUにバインドされていないことです。 IOバインドかディスクバインドかを調べるには、さらに調査する必要があります。 – ChrisF

答えて

4

さて、あなたはその「スリープ」のコールを削除したいと思う - 時間の有意な量を服用されていないあなたの「処理」を、そしてそれのほとんどだ費やしています睡眠時間。

また、オプティマイザがコードに対して行っていることを確認することもできます。ループ内の 'p'と 'red'(および乗算)を完全に削除した場合(結果が使用されないため)、私は完全に驚くことはありません。あなたは '赤'を揮発性とすることができますが、それは計算を削除しないように強制する必要があります。

関連する問題