• 线程优先级


    l       线程优先级

    l       获取当前线程句柄

    l       线程优先级设置

    l       线程优先级变动

    l       线程优先级获取

          

    一、线程优先级(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 ",GetCurrentThreadId(),GetCurrentThreadId());

            break;

             case 1:

                      r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_LOWEST);//设置为 较低

                      TRACE("thread=%d,%04x  set priority to THREAD_PRIORITY_LOWEST ",GetCurrentThreadId(),GetCurrentThreadId());

            break;

             case 2:

                      r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL); //设置为 低于标准

                      TRACE("thread=%d,%04X  set priority to THREAD_PRIORITY_BELOW_NORMAL ",GetCurrentThreadId(),GetCurrentThreadId());

            break;

             case 3:

                      r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);  //设置为 标准

                      TRACE("thread=%d,%04X  set priority to THREAD_PRIORITY_NORMAL ",GetCurrentThreadId(),GetCurrentThreadId());

                      break;

             case 4:

                      r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL);  //设置为 高于标准

                      TRACE("thread=%d,%04X  set priority to THREAD_PRIORITY_ABOVE_NORMAL ",GetCurrentThreadId(),GetCurrentThreadId());

                      break;

             case 5:

                      r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);  //设置为 较高

                      TRACE("thread=%d,%04X  set priority to THREAD_PRIORITY_HIGHEST ",GetCurrentThreadId(),GetCurrentThreadId());

                      break;

             case 6:

                      r=SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);  //设置为 最高

                      TRACE("thread=%d,%04X  set priority to THREAD_PRIORITY_TIME_CRITICAL ",GetCurrentThreadId(),GetCurrentThreadId());

                      break;

             default:

                      break;

     

             }      

    }

  • 相关阅读:
    谷歌浏览器内核自带长截图
    js文件导入swiper方法及分页器不显示原因
    Error: Cannot find module 'gifsicle'问题解决
    新型横向移动工具原理分析、代码分析、优缺点以及检测方案
    武汉解封一周年
    JAVA线程池ThreadPoolExecutor的分析和使用(新手踩坑和推荐方案)
    JAVA常量池
    Java String的intern()注意事项(分JDK1.6及JDK1.7)
    JAVA的类加载过程
    react hooks方法获取不到最新的state解决方法
  • 原文地址:https://www.cnblogs.com/15157737693zsp/p/3843055.html
Copyright © 2020-2023  润新知