知識點: 線程優先級 獲取當前線程句柄 線程優先級設置 線程優先級變動 線程優先級獲取 一、線程優先級(Thread priority ) 簡單的說就是(線程)的優先級越高,那么就可以分占相對多的CPU時間片。 每個進程都有相應的優先級,優先級決定它何時運行和占用 CPU 時間。最終的優先級共分32級,是從 0 到 31 的數值,稱為基本優先級別。 進程優先級 priority class 標志 優先級值 idle (低) IDLE_PRIORITY_CLASS 4 Below 低於標准 BELOW_NORMAL_PRIORITY_CLASS 此值在2000以下系統不支持 normal (標准) NORMAL_PRIORITY_CLASS 9(前台) 或 7(后台) Above 高於標准 ABOVE_NORMAL_PRIORITY_CLASS 此值在2000以下系統不支持 high (高) HIGH_PRIORITY_CLASS 13 realtime (實時) REALTIME_PRIORITY_CLASS 24 一個線程創建的時候,會繼承進程的優先級等級。另外線程優先級可以用SetThreadPriority來進行微調: 微調范圍 線程優先級等級 標志 優先級值 1 idle (最低) THREAD_PRIORITY_IDLE 如果進程優先級為realtime則調整為16,其它情況為1 2 LOWEST 低 THREAD_PRIORITY_LOWEST -2(在原有基礎上-2) 3 BELOW 低於標准 THREAD_PRIORITY_BELOW_NORMAL -1(在原有基礎上-1) 4 NORMAL(標准) THREAD_PRIORITY_NORMAL 不變(取進程優先級值) 5 ABOVE 高於標准 THREAD_PRIORITY_ABOVE_NORMAL +1(在原有基礎上+1) 6 HIGHEST (高) THREAD_PRIORITY_HIGHEST +2(在原有基礎上+2) 7 CRITICAL(最高) THREAD_PRIORITY_TIME_CRITICAL 如果進程優先級為realtime則調整為31,其它情況為15 二、獲取當前線程句柄 HANDLE GetCurrentThread(VOID) //返回當前進句柄 DWORD GetCurrentThreadId(VOID) //返回當前進程ID值 1、其它線程函數 BOOL SetThreadPriority 設置一個線程的優先級別 int GetThreadPriority 返回一個線程的 優先級別 SetThreadPriorityBoost 設置線程是否禁用動態調整優先級功能。 GetThreadPriorityBoost 獲取線程是否禁用了優先級微調功能。 三、線程優先級的設置 BOOL SetThreadPriority ( HANDLE hThread,// 線程句柄 handle to the thread int nPriority // 要設置線程優先級別thread priority level ); void CDialog_PROCESS::OnBnClickedRadio7() { // TODO: 在此添加控件通知處理程序代碼 BOOL r=0; UpdateData(true); switch (m_radio_thread_selNum) { case 0: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_IDLE); //設置為 最低 TRACE("thread=%d,%04x set priority to THREAD_PRIORITY_IDLE \n",GetCurrentThreadId(),GetCurrentThreadId()); break; case 1: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_LOWEST);//設置為 較低 TRACE("thread=%d,%04x set priority to THREAD_PRIORITY_LOWEST \n",GetCurrentThreadId(),GetCurrentThreadId()); break; case 2: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL); //設置為 低於標准 TRACE("thread=%d,%04X set priority to THREAD_PRIORITY_BELOW_NORMAL \n",GetCurrentThreadId(),GetCurrentThreadId()); break; case 3: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL); //設置為 標准 TRACE("thread=%d,%04X set priority to THREAD_PRIORITY_NORMAL \n",GetCurrentThreadId(),GetCurrentThreadId()); break; case 4: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL); //設置為 高於標准 TRACE("thread=%d,%04X set priority to THREAD_PRIORITY_ABOVE_NORMAL \n",GetCurrentThreadId(),GetCurrentThreadId()); break; case 5: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); //設置為 較高 TRACE("thread=%d,%04X set priority to THREAD_PRIORITY_HIGHEST \n",GetCurrentThreadId(),GetCurrentThreadId()); break; case 6: r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); //設置為 最高 TRACE("thread=%d,%04X set priority to THREAD_PRIORITY_TIME_CRITICAL \n",GetCurrentThreadId(),GetCurrentThreadId()); break; default: break; } }