2009-03-02 9 views
23

Próbuję zmienić priorytet wątku w doładowaniu, ale nie mam szczęścia. Otrzymuję zły błąd obsługi (typ 6) z funkcji GetLastError. I chociaż native_handle() zwrócił uchwyt wątku?Zmiana priorytetu wątku zwiększającego w systemie Windows

Czy ktoś wie, jak to zrobić?

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: Kod końcowa:

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 
} 

Odpowiedz

18

funkcja Zastosowanie SetThreadPriority ustawić priorytet wątku. SetPriorityClass służy do ustawienia priorytetu procesu. Musisz również zmienić wartości priorytetów, zobacz dokumentację dla SetThreadPriority, aby uzyskać szczegółowe informacje.

+0

To był głupi błąd. Zrobię to teraz. Dzięki – Lodle

3

Funkcja SetPriorityClass przyjmuje jako swój pierwszy parametr UCHWYT, przekazujesz wskaźnik do UCHWYTU. Zmień to na:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

lub coś podobnego. Jądro może stwierdzić, że wartość wskaźnika, którą przekazałeś, nie jest tak naprawdę prawidłowym uchwytem wątku, ponieważ domyślam się, że zachowuje wewnętrzną listę aktualnie przydzielonych uchwytów wątków. Wskaźnik oczywiście nie znajduje się na tej liście. Kompilator naprawdę nie może wymuszać lepszego bezpieczeństwa, ponieważ UCHWYT jest rodzajem nieprzejrzystego typu - po prostu musisz być bardzo ostrożny, co przekazujesz.

A tak przy okazji, drugi komentujący Dani ma rację, SetPriorityClass nie jest używane do ustawiania priorytetu wątku, mimo to chcesz użyć SetThreadPriority. Ale wtedy moja rada byłaby nadal ważna, musisz podać RĘKĘ, a nie wskaźnik do takich.

+0

Rzeczą było, żebym bałaganił z kodem przed ręką i nie naprawiał tego. Ale dzięki za pomoc w każdy sposób. : P – Lodle

Powiązane problemy