Windowsでブーストスレッドの優先度を変更する
-
03-07-2019 - |
質問
ブーストでスレッドの優先度を変更しようとしていますが、運がありません。 GetLastError関数から不正なハンドルエラー(タイプ6)を取得しています。 native_handle()はスレッドのハンドルを返しましたか?
これを行う方法を知っている人はいますか
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
}
解決
スレッドの優先度を設定するには、SetThreadPriority関数を使用します。 SetPriorityClassは、プロセスの優先度を設定するために使用されます。優先度の値も変更する必要があります。 SetThreadPriority をご覧ください。
他のヒント
SetPriorityClass
関数は、最初のパラメーターとしてハンドルを取り、ハンドルへのポインターを渡します。次のように変更します。
res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);
または同等のもの。カーネルは、渡されたポインター値が実際に有効なスレッドハンドルではないことを認識できます。これは、現在割り当てられているスレッドハンドルの内部リストを保持しているためだと思います。ポインタは明らかにそのリストにはありません。 HANDLEは不透明な型であるため、コンパイラはより優れた型安全性を実際に強制することはできません-渡すものに本当に注意する必要があります。
ところで、他のコメンターのダニは正しいです。 SetPriorityClass
はスレッドの優先順位の設定には使用されません。とにかく SetThreadPriority
を使用したいです。しかし、それでも私のアドバイスは有効です。ハンドルへのポインタではなく、ハンドルを渡す必要があります。
所属していません StackOverflow