改变进程优先类和线程相对优先级

进程只有优先类,这是一个微软为了方便学习理解而抽象的标志,进程优先类总共有六个,分别是idle, below normal, normal, ablove normal, high, real-time。对应的标志位分别是IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS。我们可以在创建进程时即调用CreateProcess函数时,在fdwCreate中传入需要指定的优先类。也可以在进程运行是调用SetPriorityClass函数来改变自己的优先类。一般来说在创建进程时由于默认fdwCleate传入NULL,进程会默认设置为normal优先类。

线程有七个优先级,分别是idle, lowest, below normal, normal, above normal, highest, time-cirtical,对应的标志位分别是THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL,  THREAD_PRIORITY_HIGNEST, THREAD_PRIORITY_TIME_CRITICAL。值得注意的是time-critical一般是系统的实时线程,优先级为16至31之间,系统动态提升线程优先级不会提升到这个级别,即只能在1至15之间。下面展示一段代码并分析。

DWORD idThread,

HANDLE hThread = CreateThread(NULL, 0, ThreadFunc,NULL, CREATE_SUSPEND, &idThread);

setThreadPriority(hThread,THREAD_PRIORITY_IDLE);

ResumeThread(hThread);

CloseThread(hThread);

第一行是声明一个线程id。第二行创建线程并将CREATE_SUSPEND参数传入,表示创建完成后立即挂起此线程。这里我为了简洁就没有用c++中的_beginthreadex,我们自己在创建线程时一定要使用_beginthreadex或者其他语言提供的接口。还有需要注意的是挂起的是我们刚刚创建的子线程,我们的主线程任然在执行代码(或挂起,取决于操作系统)。下面这行就是用setThreadPriority函数来改变线程的优先级,此函数第一个参数接受一个线程句柄,第二个参数接受要变为优先级的标志位。

后面的两行就是释放线程以及关闭线程句柄。



猜你喜欢

转载自blog.csdn.net/puppet_person/article/details/80993084