关于windows线程优先级 SetPriorityClassSetThreadPriority 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你在创建线程时可以指定线程的优先级,在使用过程中可以使用函数SetThreadPriority来重新设置线程的优先级 好像Windows不允许把线程的优先级提升到实时级以上(大于15的),若是想改到15的话,只好用SetThreadPriority,标志为THREAD_PRIORITY_TIME_CRITICAL. 用BOOL SetThreadPriority( HANDLE hThread, // handle to the thread int nPriority // thread priority level); 用BOOL SetThreadPriority( HANDLE hThread, // handle to the thread int nPriority // thread priority level); 或BOOL SetPriorityClass( HANDLE hProcess, // handle to the process DWORD dwPriorityClass // priority class value); 都没有办法将线程的优先级设定为高于15的数,应该是可以的,WINDOWs有高于15的优先级,就应该可以设定。谁还有办法,没想到这个问题会这么难,竟然没有能告诉我一个正确的答案。 线程优先级是相对于进程的,提高进程优先级就可以提高线程优先BOOL SetPriorityClass( HANDLE hProcess, // handle to the process DWORD dwPriorityClass // priority class value); o lu_zi:我可以理解你的需求,因为如果有多个工作线程时,把进程提到Realtime级是非常危险的。所以要将进程保持在Realtime之下,在需要的时候将特定的线程提高到realtime。你这问题确实有一定难度(分给得也太少了,至少300分:D,开个玩笑),我只是顺便简单试了一下,可以改得象system进程里那样,本身的进程优先级(PriorityClass)是8,但有些线程优先级(有效优先级base priority)确大于15,也就是在realtime下。这里你要调用ZwSetInformationThread才行,本来SetThreadPriority就调用它的,但是注意头文件里的词语混淆之处: ZwSetInformationThread的第二个参数里可用的有ThreadBasePriority和ThreadPriority,本来是我们通常理解的把class和相对priority组合后的叫base priority,base priority的取值是0-31;但注意这里SetThreadPriority调用时向ZwSetInformationThread传递确是ThreadBasePriority。只要priority大于15,那么ZwSetInformationThread就会返回参数错误。那么我们可以知道ThreadBasePriority反而是一个相对的priority。这时我们看还有一个参数可用就是ThreadPriority,但在用户态下是没法把这个参数传进去的,ZwSetInformationThread会告诉你privilege不够,所以要到kernel模式下执行。我们可以写个驱动程序,然后调用驱动程序在kernel模式下来设就行了。根据我的测试,这种办法是可行的。在用ThreadPriority的时候实际上是我们通常讲的组合后的优先级(叫有效优先级吧,一般文档里叫的base priority)。随后我们用pstat(调用的是NtQuerySystemInformation)来看的话都"有可能"不准的,当然要知道是否到了realtime级就太容易了,只要线程有个cpu忙的循环,系统就会"挂起"的。在kernel模式下还有一个调用KeSetPriorityThread我没有试验过,估计象ZwSetInformationThread那样也可以吧。 bugn:我没有想到这个问题会这么难,原以为只要调用几个用户态的函数就好了,多谢.很高兴和高手相识,希望以后多多指教!!! 可伸缩的窗口 【求助】图像翻转90度后的问题,谢谢啦 十进制字符串转十六进制字符串 为什么DEFINE_GUID无效? CGridCtrl 支持多大的数据量?有没有什么Bug?Up有分!! 请问如何将数据库导出到Excel? 怪事,如何解决??(关于程序间通信) javascript调用activex出错问题 IOCP 投递recv 请求失败 关于消息处理函数 真正程序员必须关心的问题:怎样............. 哪里有《"Programming Windows with MFC"》的电子书下载,急!
只好用SetThreadPriority,标志为THREAD_PRIORITY_TIME_CRITICAL.
BOOL SetThreadPriority(
HANDLE hThread, // handle to the thread
int nPriority // thread priority level
);
BOOL SetThreadPriority(
HANDLE hThread, // handle to the thread
int nPriority // thread priority level
);
或
BOOL SetPriorityClass(
HANDLE hProcess, // handle to the process
DWORD dwPriorityClass // priority class value
);
应该是可以的,WINDOWs有高于15的优先级,就应该可以设定。
谁还有办法,没想到这个问题会这么难,竟然没有能告诉我一个正确的答案。
BOOL SetPriorityClass(
HANDLE hProcess, // handle to the process
DWORD dwPriorityClass // priority class value
);
ZwSetInformationThread的第二个参数里可用的有ThreadBasePriority和ThreadPriority,本来是我们通常理解的把class和相对priority组合后的叫base priority,base priority的取值是0-31;但注意这里SetThreadPriority调用时向ZwSetInformationThread传递确是ThreadBasePriority。只要priority大于15,那么ZwSetInformationThread就会返回参数错误。那么我们可以知道ThreadBasePriority反而是一个相对的priority。这时我们看还有一个参数可用就是ThreadPriority,但在用户态下是没法把这个参数传进去的,ZwSetInformationThread会告诉你privilege不够,所以要到kernel模式下执行。我们可以写个驱动程序,然后调用驱动程序在kernel模式下来设就行了。根据我的测试,这种办法是可行的。在用ThreadPriority的时候实际上是我们通常讲的组合后的优先级(叫有效优先级吧,一般文档里叫的base priority)。随后我们用pstat(调用的是NtQuerySystemInformation)来看的话都"有可能"不准的,当然要知道是否到了realtime级就太容易了,只要线程有个cpu忙的循环,系统就会"挂起"的。在kernel模式下还有一个调用KeSetPriorityThread我没有试验过,估计象ZwSetInformationThread那样也可以吧。
我没有想到这个问题会这么难,原以为只要调用几个用户态的函数就好了,多谢.
很高兴和高手相识,希望以后多多指教!!!