mfc 線程的優先級


知識點:
    線程優先級
    獲取當前線程句柄
    線程優先級設置
    線程優先級變動
    線程優先級獲取
       
一、線程優先級(Thread priority )

    簡單的說就是(線程)的優先級越高,那么就可以分占相對多的CPU時間片。   每個進程都有相應的優先級,優先級決定它何時運行和占用 CPU 時間。最終的優先級共分32級,是從 031 的數值,稱為基本優先級別。
           


進程優先級 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(在原有基礎上-23    BELOW   低於標准    THREAD_PRIORITY_BELOW_NORMAL    -1(在原有基礎上-14    NORMAL(標准)    THREAD_PRIORITY_NORMAL    不變(取進程優先級值)
5    ABOVE    高於標准    THREAD_PRIORITY_ABOVE_NORMAL    +1(在原有基礎上+16    HIGHEST (高)    THREAD_PRIORITY_HIGHEST    +2(在原有基礎上+27    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;

    }    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM