2009-03-02 191 views
23

我試圖改變線程的優先級,但我沒有運氣。我從GetLastError函數得到一個錯誤的句柄錯誤(類型6)。我雖然native_handle()返回線程的句柄?在Windows中更改提升線程優先級

任何人都知道如何做到這一點?

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 
} 

回答

18

使用SetThreadPriority函數函數來設置線程的優先級。 SetPriorityClass用於設置進程的優先級。您還必須更改優先級值,有關詳細信息,請參閱SetThreadPriority的文檔。

+0

這是一個愚蠢的錯誤。我現在就放棄它。謝謝 – Lodle 2009-03-02 06:42:15

3

SetPriorityClass函數將第一個參數作爲HANDLE參數傳遞給一個HANDLE指針。將其更改爲:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

或其他等效物。內核可以告訴你傳入的指針值不是一個真正有效的線程句柄,因爲我猜它維護着一個當前分配的線程句柄的內部列表。指針顯然不在該列表中。編譯器不能真正執行更好的類型安全性,因爲HANDLE是一種不透明類型 - 你只需要非常小心你通過什麼。

哦順便說一句,其他評論者Dani是正確的,SetPriorityClass不用於設置線程的優先級,您想要使用SetThreadPriority。但是,我的建議仍然存在,你需要傳遞一個句柄,而不是指向這樣的指針。

+0

指針的事情是我搞亂了代碼,沒有修復它。但感謝您的幫助。 :P – Lodle 2009-03-02 06:51:31