2009-03-02 6 views
23

Ich versuche, die Thread-Priorität in Boost ändern, aber ich habe kein Glück. Ich bekomme einen schlechten Handle-Fehler (Typ 6) von der GetLastError-Funktion. Ich habe native_handle() das Handle für den Thread zurückgegeben?Ändern Boost Thread-Priorität in Windows

Jeder weiß, wie man das macht?

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 
} 

bearbeiten: Schlusscode:

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 
} 

Antwort

18

Verwenden SetThreadPriority Funktion der Thread-Priorität einzustellen. SetPriorityClass wird verwendet, um die Priorität des Prozesses festzulegen. Sie müssen auch die Prioritätswerte ändern, siehe Dokumentation für SetThreadPriority für Details.

+0

das war ein dummer Fehler. Ich werde es jetzt versuchen. Danke – Lodle

3

Die SetPriorityClass Funktion nimmt als ersten Parameter einen HANDLE, Sie übergeben einen Zeiger an einen GRIFF. Ändern Sie es in:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

oder etwas Äquivalentes. Der Kernel kann feststellen, dass der Zeigerwert, den Sie übergeben haben, nicht wirklich ein gültiges Thread-Handle ist, da ich denke, dass er eine interne Liste der aktuell zugewiesenen Thread-Handles verwaltet. Der Zeiger ist offensichtlich nicht in dieser Liste. Der Compiler kann nicht wirklich bessere Typsicherheit erzwingen, da ein HANDLE eine Art undurchsichtiger Typ ist - man muss nur wirklich vorsichtig sein, was man eingibt.

Ach übrigens, der andere Kommentator Dani ist richtig, SetPriorityClass wird nicht zum Setzen der Priorität eines Threads verwendet, Sie möchten trotzdem SetThreadPriority verwenden. Aber dann würde mein Rat immer noch stehen, du musst einen GRIFF einreichen, keinen Hinweis darauf.

+0

Das Pointer-Ding war ich mit dem Code vor der Hand durcheinander bringen und nicht reparieren. Aber danke für deine Hilfe. : P – Lodle

Verwandte Themen