CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

如何设置优先级?

楼主nowokcom(蚊子蜂)2002-02-05 00:56:00 在 VC/MFC / 基础类 提问

如何更改程序优先级?  
  希望附代码.  
  谢谢! 问题点数:30、回复次数:4Top

1 楼liu_feng_fly(笑看风云 搏击苍穹 衔日月)回复于 2002-02-05 08:38:01 得分 10

CWinThread::SetThreadPriority  
  BOOL   SetThreadPriority(   int   nPriority   );  
   
  Return   Value  
   
  Nonzero   if   function   was   successful;   otherwise   0.  
   
  Parameters  
   
  nPriority  
   
  Specifies   the   new   thread   priority   level   within   its   priority   class.   This   parameter   must   be   one   of   the   following   values,   listed   from   highest   priority   to   lowest:    
   
  THREAD_PRIORITY_TIME_CRITICAL  
   
   
  THREAD_PRIORITY_HIGHEST  
   
   
  THREAD_PRIORITY_ABOVE_NORMAL  
   
   
  THREAD_PRIORITY_NORMAL  
   
   
  THREAD_PRIORITY_BELOW_NORMAL  
   
   
  THREAD_PRIORITY_LOWEST  
   
   
  THREAD_PRIORITY_IDLE   Top

2 楼hooligan(风)回复于 2002-02-05 08:42:06 得分 10

线程  
  BOOL   SetThreadPriority(  
      HANDLE   hThread,   //   handle   to   the   thread  
      int   nPriority       //   thread   priority   level  
  );  
   
  进程  
  BOOL   SetPriorityClass(  
      HANDLE   hProcess,                 //   handle   to   process  
      DWORD   dwPriorityClass       //   priority   class  
  );Top

3 楼nowokcom(蚊子蜂)回复于 2002-02-06 07:33:38 得分 0

看不懂.Top

4 楼xiaoxiaohan(萧晓寒)回复于 2002-02-06 08:26:24 得分 10

线程的调度、优先级和亲缘性  
  1. 如何暂停和恢复线程的运行?  
  线程内核对象的内部有一个值指明线程的暂停计数。当调用CreateProcess或CreateThread函数时,就创建了线程的内核对象,并且它的暂停计数被初始化为1。因为线程的初始化需要时间,不能在系统做好充分的准备之前就开始执行线程。线程完全初始化好了之后,CreateProcess或CreateThread要查看是否已经传递了CREATE_SUSPENDED标志。如果已经传递了这个标志,那么这些函数就返回,同时新线程处于暂停状态。如果尚未传递该标志,那么该函数将线程的暂停计数递减为0。当线程的暂停计数是0的时候,除非线程正在等待其他某种事情的发生,否则该线程就处于可调度状态。在暂停状态中创建一个线程,就能够在线程有机会执行任何代码之前改变线程的运行环境(如优先级)。一旦改变了线程的环境,必须使线程成为可调度线程。方法如下:  
  hThread   =   CreatThread(   ……,CREATE_SUSPENDED,……   );  
  或  
  bCreate   =   CreatProcess(   ……,CREATE_SUSPENDED,……,pProcInfo   );  
  if(   bCreate   !=   FALSE   )  
  {  
  hThread   =   pProcInfo.hThread;  
  }  
  ……  
  ……  
  ……  
  ResumeThread(   hThread   );  
  CloseHandle(   hThread   );  
  ResumeThread成功,它将返回线程的前一个暂停计数,否则返回0xFFFFFFFF。  
  单个线程可以暂停若干次。如果一个线程暂停了3次,它必须恢复3次。创建线程时,除了使用CREATE_SUSPENDED外,也可以调用SuspendThread函数来暂停线程的运行。任何线程都可以调用该函数来暂停另一个线程的运行(只要拥有线程的句柄)。线程可以自行暂停运行,但是不能自行恢复运行。与ResumeThread一样,SuspendThread返回的是线程的前一个暂停计数。线程暂停的最多次数可以是MAXIMUM_SUSPEND_COUNT次。SuspendThread与内核方式的执行是异步进行的,但是在线程恢复运行之前,不会发生用户方式的执行。调用SuspendThread时必须小心,因为不知道暂停线程运行时它在进行什么操作。只有确切知道目标线程是什么(或者目标线程正在做什么),并且采取强有力的措施来避免因暂停线程的运行而带来的问题或死锁状态,SuspendThread才是安全的。  
  2. 是否可以暂停和恢复进程的运行?  
  对于Windows来说,不存在暂停或恢复进程的概念,因为进程从来不会被安排获得CPU时间。不过Windows确实允许一个进程暂停另一个进程中的所有线程的运行,但是从事暂停操作的进程必须是个调试程序。特别是,进程必须调用WaitForDebugEvent和ContinueDebugEvent之类的函数。由于竞争的原因,Windows没有提供其他方法来暂停进程中所有线程的运行。  
  3. 如何使用sleep函数?  
  •系统将在大约的指定毫秒数内使线程不可调度。Windows不是个实时操作系统。虽然线程可能在规定的时间被唤醒,但是它能否做到,取决于系统中还有什么操作正在进行。  
  •可以调用Sleep,并且为dwMilliseconds参数传递INFINITE。这将告诉系统永远不要调度该线程。这不是一件值得去做的事情。最好是让线程退出,并还原它的堆栈和内核对象。  
  •可以将0传递给Sleep。这将告诉系统,调用线程将释放剩余的时间片,并迫使系统调度另一个线程。但是,系统可以对刚刚调用Sleep的线程重新调度。如果不存在多个拥有相同优先级的可调度线程,就会出现这种情况。  
  4. 如何转换到另一个线程?  
  系统提供了SwitchToThread函数。当调用这个函数的时候,系统要查看是否存在一个迫切需要CPU时间的线程。如果没有线程迫切需要CPU时间,SwitchToThread就会立即返回。如果存在一个迫切需要CPU时间的线程,SwitchToThread就对该线程进行调度(该线程的优先级可能低于调用SwitchToThread的线程)。这个迫切需要CPU时间的线程可以运行一个时间段,然后系统调度程序照常运行。该函数允许一个需要资源的线程强制另一个优先级较低、而目前却拥有该资源的线程放弃该资源。如果调用SwitchToThread函数时没有其他线程能够运行,那么该函数返回FALSE,否则返回一个非0值。调用SwitchToThread与调用Sleep是相似的。差别是SwitchToThread允许优先级较低的线程运行;而即使有低优先级线程迫切需要CPU时间,Sleep也能够立即对调用线程重新进行调度。  
  5. 如何取得线程运行的时间?  
  (1) 简单取得线程大概运行时间:  
  DWORD   dwStartTime   =   0;  
  DWORD   dwEndTime   =   0;  
  DWORD   dwRunTime   =   0;  
  dwStartTime   =   GetTickCount(     );  
  ……  
  ……  
  ……  
  dwEndTime   =   GetTickCount(     );  
  dwRunTime   =   dwEndTime   –   dwStartTime;  
  (2) 调用GetThreadTimes的函数:  
  参数 含义  
  hThread 线程句柄  
  lpCreationTime 创建时间:英国格林威治时间  
  lpExitTime 退出时间:英国格林威治时间,如果线程仍然在运行,退出时间则未定义  
  lpKernelTime 内核时间:指明线程执行操作系统代码已经经过了多少个100ns的CPU时间  
  lpUserTime 用户时间:指明线程执行应用程序代码已经经过了多少个100ns的CPU时间  
  GetProcessTimes是个类似GetThreadTimes的函数,适用于进程中的所有线程(甚至是已经终止运行的线程)。返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和。GetThreadTimes和GetProcessTimes这两个函数在Windows98中不起作用。在Windows98中,没有一个可靠的机制可供应用程序来确定线程或进程已经使用了多少CPU时间。  
  6. 进程的优先级类有哪些?  
  优先级类 标识符 描述  
  实时 REALTIME_PRIORITY_CLASS 立即对事件作出响应,执行关键时间的任务。会抢先于操作系统组件之前运行。  
  高 HIGH_PRIORITY_CLASS 立即对事件作出响应,执行关键时间的任务。  
  高于正常 ABOVE_NORMAL_PRIORITY_CLASS 在正常优先级与高优先级之间运行(Windows2000)。  
  正常 NORMAL_PRIORITY_CLASS 没有特殊调度需求  
  低于正常 BELOW_NORMAL_PRIORITY_CLASS 在正常优先级与空闲优先级之间运行(Windows2000)。  
  空闲 IDLE_PRIORITY_CLASS 在系统空闲时运行。  
  设置方法:  
  BOOL   SetPriorityClass(   HANDLE   hProcess,   DWORD   dwPriority   );  
  DWORD   GetPriorityClass(   HANDLE   hProcess   );  
  使用命令外壳启动一个程序时,该程序的起始优先级是正常优先级。如果使用Start命令来启动该程序,可以使用一个开关来设定应用程序的起始优先级。例如:  
  c:\>START   /LOW   CALC.EXE  
  Start命令还能识别/BELOWNORMAL、/NORMAL、/ABOVENORMAL、/HIGH和/REALTIME等开关。  
  7. 线程的相对优先级有哪些?  
  相对优先级 标识符 描述  
  关键时间 THREAD_PRIORITY_TIME_CRITICAL 对于实时优先级类线程在优先级31上运行,对于其他优先级类,线程在优先级15上运行。  
  最高 THREAD_PRIORITY_HIGHEST 线程在高于正常优先级上两级上运行。  
  高于正常 THREAD_PRIORITY_ABOVE_NORMAL 线程在正常优先级上一级上运行。  
  正常 THREAD_PRIORITY_NORMAL 线程在进程的优先级类上正常运行。  
  低于正常 THREAD_PRIORITY_BELOW_NORMAL 线程在低于正常优先级下一级上运行。  
  最低 THREAD_PRIORITY_LOWEST 线程在低于正常优先级下两级上运行。  
  空闲 THREAD_PRIORITY_IDLE 对于实时优先级类线程在优先级16上运行对于其他优先级类线程在优先级1上运行。  
  设置方法:  
  BOOL   SetThreadPriority(   HANDLE   hThread,   DWORD   dwPriority   );  
  DWORD   GetThreadPriorityClass(   HANDLE   hThread   );  
  8. 如何避免系统动态提高线程的优先级等级?  
  系统常常要提高线程的优先级等级,以便对窗口消息或读取磁盘等I/O事件作出响应。或者当系统发现一个线程在大约3至4s内一直渴望得到CPU时间,它就将这个渴望得到CPU时间的线程的优先级动态提高到15,并让该线程运行两倍于它的时间量。当到了两倍时间量的时候,该线程的优先级立即返回到它的基本优先级。下面的函数可以对系统的调度方式进行设置:  
  BOOL   SetProcessPriorityBoost(   HANDLE   hProcess,   BOOL   bDisableBoost   );  
  BOOL   GetProcessPriorityBoost(   HANDLE   hProcess,   PBOOL   pbDisableBoost   );  
  BOOL   SetThreadPriorityBoost(   HANDLE   hThread,   BOOL   bDisableBoost   );  
  BOOL   GetThreadPriorityBoost(   HANDLE   hThread,   PBOOL   pbDisableBoost   );  
  SetProcessPriorityBoost负责告诉系统激活或停用进行中的所有线程的优先级提高功能,而SetThreadPriorityBoost则激活或停用各个线程的优先级提高功能。Windows98没有提供这4个函数的有用的实现代码。  
  Top

相关问题

  • Thread如何设置优先级?
  • 如何设置进程的优先级?谢谢
  • 请问如何设置软件的系统优先级别!
  • 如何设置进程优先级???高手一定要进!!(
  • 请教如何设置java应用程序的进程优先级?
  • QoS问题请教:如何使能、设置一个Socket的优先级?多谢!
  • 怎么设置进程优先级?
  • 请教设置进程优先级
  • 如何修改中断的优先级?
  • CDO如何改变邮件优先级?

关键词

  • windows2000
  • 线程
  • 函数
  • 系统
  • 代码
  • 执行
  • 优先级
  • 运行
  • 暂停
  • 调用

得分解答快速导航

  • 帖主:nowokcom
  • liu_feng_fly
  • hooligan
  • xiaoxiaohan

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo