Ändern Sie Boost-Thread-Priorität in Windows
-
03-07-2019 - |
Frage
Im Versuch, die Thread-Priorität in Schub zu ändern, aber im kein Glück. Im immer einen schlechten Griff-Fehler (Typ 6) von der GetLastError Funktion. Ich obwohl native_handle () zurückgegeben das Handle für den Thread?
Jeder weiß, wie dies zu tun?
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
}
edit: Schluss Code:
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
}
Lösung
Mit SetThreadPriority Funktion der Thread-Priorität einzustellen. SetPriorityClass wird verwendet, um die Priorität des Prozesses einzustellen. Sie müssen auch die Prioritätswerte ändern, siehe Dokumentation für SetThreadPriority für Details.
Andere Tipps
Die SetPriorityClass
Funktion nimmt, wie es eine GRIFF erster Parameter ist, können Sie in einem Zeiger auf einen Griff sind vorbei. Ändern Sie es an:
res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);
oder etwas Gleichwertiges. Der Kernel kann sagen, dass der Zeiger Wert, den Sie in geben wird, ist nicht wirklich ein gültiger Thread-Handle, weil ich denke, es verwaltet eine interne Liste der zur Zeit Thread-Handles zugewiesen. Der Zeiger ist offensichtlich nicht in dieser Liste. Der Compiler kann nicht wirklich besser Typsicherheit durchzusetzen, da ein GRIFF Art einer undurchsichtigen Art ist -. Sie nur wirklich sein muss aufpassen, was Sie passieren in
Ach übrigens, der andere Kommentator Dani richtig ist, SetPriorityClass
zur Einstellung der Priorität eines Threads nicht verwendet wird, wollen Sie SetThreadPriority
trotzdem verwenden. Aber dann wäre mein Rat immer noch stehen, müssen Sie in einem Handle übergeben, nicht einen Zeiger auf eine solche.