我不明白如何使用SetThreadPriority
和SetPriorityClass
降低和增加线程的优先级。
我的理解是,SetPriorityClass
选择可用于进程的优先级范围,并且SetThreadPriority
设置类中的相对优先级。
例如,对线程执行此操作的结果是什么:
SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN);
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);
感谢帮助。
最佳答案
进程优先级类和线程优先级正在构建线程的base priority
。请参阅Scheduling Priorities以了解如何组合优先级。通过查看此列表,可以清楚地了解您的理解是正确的。在某个优先级类别内,base priority
可以具有由thread priority
确定的各种值。
在所有Windows版本上均不支持PROCESS_MODE_BACKGROUND_BEGIN
的SetPriorityClass
值和THREAD_MODE_BACKGROUND_END
的SetThreadPriority
值。
PROCESS_MODE_BACKGROUND_BEGIN:
系统降低了进程(及其线程)的资源调度优先级,因此它可以执行后台工作,而不会显着影响前台的 Activity 。
THREAD_MODE_BACKGROUND_END:
结束后台处理模式。系统将恢复线程的资源调度优先级,使其恢复到线程进入后台处理模式之前的状态。
这里所讨论的场景的结果是可以预见的:SetPriorityClass
将使用其所有线程的进程设置为background processing mode
。以下SetThreadPriority
将仅释放background processing mode
中的线程。但是,进程的所有其他可能的线程将在后台处理模式下保留。
注意:只有process priority class
和 thread priority
的组合才可以确定base priority
。因此,对GetThreadPriority
的调用或对GetPriorityClass
的调用都不会返回基本优先级。只有它们的组合才能释放基本优先级,这在上面的“调度优先级”链接中进行了描述。不幸的是,新的background processing mode
值尚未包括在base priority
列表中。但是名称base priority
在这里说明了重要的事情:基于基本优先级(从进程优先级类和线程优先级派生),允许调度程序动态调整调度优先级。后台模式只是fine tune
调度优先级的另一种方法。另一种方法是Priority Boosts。优先级提升功能存在一段时间。对background processing mode
和SetThreadPriority
的SetPriorityClass
值的新访问权直接打开了优先级提升功能。在Windows XP中,必须通过调用SetProcessPriorityBoost来完成。
关于windows - SetThreadPriority和SetPriorityClass,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13631644/