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
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top