SetPriorityClass
SetThreadPriority

解决方案 »

  1.   

    你在创建线程时可以指定线程的优先级,在使用过程中可以使用函数SetThreadPriority来重新设置线程的优先级
      

  2.   

    好像Windows不允许把线程的优先级提升到实时级以上(大于15的),若是想改到15的话,
    只好用SetThreadPriority,标志为THREAD_PRIORITY_TIME_CRITICAL.
      

  3.   


    BOOL SetThreadPriority(
      HANDLE hThread, // handle to the thread
      int nPriority   // thread priority level
    );
     
      

  4.   


    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
    );
     
      

  5.   

    都没有办法将线程的优先级设定为高于15的数,
    应该是可以的,WINDOWs有高于15的优先级,就应该可以设定。
    谁还有办法,没想到这个问题会这么难,竟然没有能告诉我一个正确的答案。
      

  6.   

    线程优先级是相对于进程的,提高进程优先级就可以提高线程优先
    BOOL SetPriorityClass(
      HANDLE hProcess,        // handle to the process
      DWORD dwPriorityClass   // priority class value
    );
     
      

  7.   

    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那样也可以吧。
      

  8.   

    bugn:
    我没有想到这个问题会这么难,原以为只要调用几个用户态的函数就好了,多谢.
    很高兴和高手相识,希望以后多多指教!!!