Delphi多线程学习(8):优先级

一个线程的优先级取决于创建线程的进程的优先级(priority class)和线程本身相对的优先级(relative priority)。

    1、进程优先级:

    不同操作系统 优先级数目不同。Windows2000以上的版本列表如下:

Idle:(标志:IDLE_PRIORITY_CLASS,值为$40);
Below Normal:(标志:BELOW_NORMAL_PRIORITY_CLASS,值为$4000);
Normal:(标志:NORMAL_PRIORITY_CLASS,值为$20);
Above Normal:(标志:ABOVE_NORMAL_PRIORITY_CLASS,值为$8000);
High:(标志:HIGH_PRIORITY_CLASS,值为$80);
Realtime:(标志:REALTIME_PRIORITY_CLASS,值为$100)。
进程的缺省优先级为Normal,几乎所有场合都不应将优先级设为Realtime。

创建进程时给定优先级,只要在CreateProcess中,将优先级标志做“OR”操作,填入dwCreationFlags参数中。

取得活动进程的优先级:

   function GetPriorityClass(hProcess:THandle):DWORD;stdcall;

设置活动进程的优先级:

   function SetPriorityClass(hProcess:THandle;dwPriorityClass:DWORD);BOOL;

(上面两个函数的hProcess由GetCurrentProcess函数获得,这个句柄不用CloseHandle关闭)

    2、线程相对优先级:

    线程优先级分7类,如下:

tpIdle:(常量:THREAD_PRIORITY_IDLE,值为-15);

tpLowest:(常量:THREAD_PRIORITY_LOWEST,值为-2);

tpBelow Normal:(常量:THREAD_PRIORITY_BELOW_NORMAL,值为-1);

tpNormal:(常量:THREAD_PRIORITY_NORMAL,值为0);

tpAbove Normal:(常量:THREAD_PRIORITY_ABOVE_NORMAL,值为1);

tpHighest:(常量:THREAD_PRIORITY_HIGEST,值为2);

tpTimeCritical:(常量:THREAD_PRIORITY_TIME_CRITICAL,值为15);

对于线程类TThread,改变线程优先级非常方便,只要将派生类的Priority属性相应设置就好了。如:MyThread.Priority:=tpHighest;

  3、线程优先级计算:

     如果线程优先级为tpIdle,无论它所处的进程优先级是多少,线程整体优先级总是1,但是,当进程优先级为Realtime时,那么与tpIdle相组合,线程整体优先级为16;

     如果线程优先级为tpTimeCritical,无论它所处的进程优先级为多少,整体优先组都是15,但是,当进程优先级是Realtime时,那与tpTimeCritical相组合,线程的整体优先级为31;

    其他情况下,整体优先级是线程相对优先级与进程优先级相加。

    优先级举例,屏幕拷贝图像:

可以看出虽然第一个线程先运行了100毫秒,但是它的优先级低于第二个线程,所以第二个线程分配更多的CPU时间片,最后第二个线程先执行完成。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asciil/archive/2009/07/17/4355997.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值