2009-03-02 22 views
23

ブーストでスレッドの優先度を変更しようとしていますが、運がないのです。 GetLastError関数から不正なハンドルエラー(タイプ6)が発生しました。私はnative_handle()スレッドのハンドルを返しましたが?Windowsでブーストスレッドの優先度を変更する

誰でもこれを行う方法はわかりますか?

void baseThread::applyPriority(uint8 priority) 
{ 

#ifdef WIN32 
    if (!m_pThread) 
     return; 

    BOOL res; 
    HANDLE th = m_pThread->native_handle(); 

    switch (priority) 
    { 
    case REALTIME : res = SetPriorityClass(th, REALTIME_PRIORITY_CLASS);  break; 
    case HIGH  : res = SetPriorityClass(th, HIGH_PRIORITY_CLASS);   break; 
    case ABOVE_NORMAL : res = SetPriorityClass(th, ABOVE_NORMAL_PRIORITY_CLASS); break; 
    case NORMAL  : res = SetPriorityClass(th, NORMAL_PRIORITY_CLASS);   break; 
    case BELOW_NORMAL : res = SetPriorityClass(th, BELOW_NORMAL_PRIORITY_CLASS); break; 
    case IDLE  : res = SetPriorityClass(th, IDLE_PRIORITY_CLASS);   break; 
    } 

    if (res == FALSE) 
    { 
     int err = GetLastError(); 
    } 

#endif 
} 

編集:最終コード:

void baseThread::applyPriority(uint8 priority) 
{ 

#ifdef WIN32 
    if (!m_pThread) 
     return; 

    BOOL res; 
    HANDLE th = m_pThread->native_handle(); 

    switch (priority) 
    { 
    case REALTIME  : res = SetThreadPriority(th, THREAD_PRIORITY_TIME_CRITICAL); break; 
    case HIGH   : res = SetThreadPriority(th, THREAD_PRIORITY_HIGHEST);   break; 
    case ABOVE_NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_ABOVE_NORMAL); break; 
    case NORMAL   : res = SetThreadPriority(th, THREAD_PRIORITY_NORMAL);   break; 
    case BELOW_NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_BELOW_NORMAL); break; 
    case IDLE   : res = SetThreadPriority(th, THREAD_PRIORITY_LOWEST);   break; 
    } 

#endif 
} 

答えて

18

使用SetThreadPriorityは、スレッドの優先順位を設定する機能します。 SetPriorityClassは、プロセスの優先順位を設定するために使用されます。また、優先度の値を変更する必要があります。詳しくはSetThreadPriorityのドキュメントを参照してください。

+0

これは愚かなエラーでした。病気は今すぐそれを与えてください。ありがとう – Lodle

3

関数は、最初のパラメータとしてハンドルをとり、ハンドルへのポインタを渡します。それを次のように変更してください:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

または同等のものに変更してください。カーネルは、渡されたポインタの値が、現在割り当てられているスレッドハンドルの内部リストを維持していると考えられるので、本当に有効なスレッドハンドルではないことを知ることができます。ポインタは明らかにそのリストにありません。コンパイラは実際に型の安全性を強化することはできません。ハンドルは不透明な型であるため、渡すものを本当に慎重に扱うだけです。

ああ、他のコメント者Daniは正しい、SetPriorityClassとにかくSetThreadPriorityを使用したい場合は、スレッドの優先順位を設定するために使用されません。しかし、私のアドバイスはまだ立っています、あなたはハンドルを渡す必要があります。

+0

ポインタのことは私が手前のコードをつまんで、それを修正していないことでした。しかし、あなたの助けをどうもありがとう。 :P – Lodle

関連する問題