我不明白如何使用SetThreadPrioritySetPriorityClass降低和增加线程的优先级。

我的理解是,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_BEGINSetPriorityClass值和THREAD_MODE_BACKGROUND_ENDSetThreadPriority值。

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 modeSetThreadPrioritySetPriorityClass值的新访问权直接打开了优先级提升功能。在Windows XP中,必须通过调用SetProcessPriorityBoost来完成。

关于windows - SetThreadPriority和SetPriorityClass,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13631644/

10-10 12:47