CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

超难:如何控制CPU使用率,大家一起讨论;如可解决,可以加分到300~1000

楼主minimu(minimu)2004-12-03 09:45:27 在 Delphi / Windows SDK/API 提问

RT,我在一款电视卡的软件(具体记不清了,老外的东西,国内的没有见过,以前想看加密电视的时候用的)里面有设置,如果设置CPU不是full占用的话,那么最多占用70~80%的CPU资源  
   
  是如何实现的?小弟才菜了,一直没有头绪,欢迎高手指点,也希望大家一起讨论  
   
  如果问题能够解决的话,散分至少300,讨论得多还可以多散分哈,绝不食言 问题点数:0、回复次数:23Top

1 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2004-12-03 09:48:56 得分 0

>>如何控制CPU使用率  
  找找   win   jobs   相關的幫助提示!  
   
  當然,   你也可設置相應的線程的優先級.  
   
  如果在你自己的程序中,   你也可多用sleep,   application.processMessage   之類來釋放占有的CPU時間  
   
  正常,   如果不是在服務器的東西,   我覺得還是小心用這種控制Top

2 楼meiqingsong(阿飛)回复于 2004-12-03 09:50:26 得分 0

http://community.csdn.net/Expert/topic/3456/3456772.xml?temp=.6938593Top

3 楼extcsdn(Studing VB now)回复于 2004-12-03 09:52:38 得分 0

关注Top

4 楼Tensionli()回复于 2004-12-03 09:52:48 得分 0

关注,帮顶Top

5 楼minimu(minimu)回复于 2004-12-03 09:56:17 得分 0

谢谢,其实就是想作一个控制程序,比如要用程序控制或者启动A、B、C三个任务  
  但是这三个任务默认都会使用100%的CPU资源,而且有优先级,如A>B=C  
  如果我先启动B或(和)C,那么A的一些请求就可能被延迟,但是使用中这是不允许的  
  所以我想可以设定CPU的使用,如B和C分别最多占用40%的资源,那么A任何时间启动都至少有20%的资源可以利用啊Top

6 楼minimu(minimu)回复于 2004-12-08 16:31:59 得分 0

没有什么进展,win   jobs   的帮助在哪儿呀?  
   
  我没有找到  
   
  Top

7 楼ZengMuAnSha(曾牧暗鲨)回复于 2004-12-08 18:33:33 得分 0

设置他们的优先级   为IDLETop

8 楼minimu(minimu)回复于 2004-12-10 10:11:10 得分 0

继续问Top

9 楼wfhlxl(光明正大地偷......学)回复于 2004-12-10 10:41:16 得分 0

in   98   is   dificullt,  
  in   win   2000   xp   ,you   can   read   registryTop

10 楼minimu(minimu)回复于 2004-12-10 13:41:23 得分 0

不是读取CPU使用率  
  而是控制,这个读取注册表是没有用处的Top

11 楼minimu(minimu)回复于 2004-12-13 16:28:36 得分 0

uPTop

12 楼ZengMuAnSha(曾牧暗鲨)回复于 2004-12-13 17:38:50 得分 0

Do.....  
  Application->ProcessMessage();  
  Sleep(10);  
  Do....Top

13 楼minimu(minimu)回复于 2004-12-14 08:36:22 得分 0

To   ZengMuAnSha(曾牧暗鲨):这样这是等待,没有办法比较准确的控制的Top

14 楼shangxuesong(幻影)回复于 2004-12-17 08:42:00 得分 0

你可以使用进程的方式,在该进程中运行一个循环,一定的间隔时间sleep()一下,我做的在cpu1.8G的情况下可以控制cpu的使用率在80%左右,但是cpu使用率肯定是有抖动的。不知道是否满足你的要求。Top

15 楼ygflydream(飞飞)回复于 2004-12-17 08:46:10 得分 0

顶!Top

16 楼princesd(中原)回复于 2004-12-17 08:47:58 得分 0

资源分配当然是OS的事.OS会自动按优先级分配给每个进程的.你不想让操作系统给那么多的话,让自己的进程优先级低些就是了.  
  Top

17 楼zglwxb(假钞换贞操)回复于 2004-12-17 08:50:06 得分 0

找了个VC的程序,转成D,N多问题,但CB却没事。  
   
  CB程序的正常,但一转成Delphi的就很多问题,那位有空改改,  
  如果成功了,多谢了告诉一声。各位老大帮俺试试  
   
  unit   Unit1;  
     
  interface  
     
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ExtCtrls,   StdCtrls;  
     
  type  
      TForm1   =   class(TForm)  
          Memo1:   TMemo;  
          Timer1:   TTimer;  
          Button1:   TButton;  
          procedure   Timer1Timer(Sender:   TObject);  
          procedure   FormCreate(Sender:   TObject);  
          procedure   FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
     
  var  
      Form1:   TForm1;  
     
  implementation  
     
  {$R   *.dfm}  
     
  const  
      MAX_RAW_VALUES   =   20;  
     
  {$A-}  
  type  
      THandle   =   Pointer;  
      PHandle   =   ^THandle;  
     
      PPDH_RAW_COUNTER   =   ^TPDH_RAW_COUNTER;  
      _PDH_RAW_COUNTER   =   record  
          CStatus:   DWORD;  
          TimeStamp:   TFileTime;  
          FirstValue:   Int64;  
          SecondValue:   Int64;  
          MultiCount:   DWORD;  
      end;  
      TPDH_RAW_COUNTER   =   _PDH_RAW_COUNTER;  
     
      PPDHCounterStruct   =   ^TPDHCounterStruct;  
      _tag_PDHCounterStruct   =   record  
          hCounter:   THandle;             //   Handle   to   the   counter   -   given   to   use   by   PDH   Library  
          hNextIndex:   Integer;  
          nOldestIndex:   Integer;  
          nRawCount:   Integer;  
          RawValue:   array   [0..MAX_RAW_VALUES   -   1]   of   TPDH_RAW_COUNTER;  
      end;  
      TPDHCounterStruct   =   _tag_PDHCounterStruct;  
     
      PPDH_FMT_CouterValue   =   ^TPDH_FMT_CouterValue;  
      _PDH_FMT_COUNTERVALUE   =   record  
          CStatus:   DWORD;  
          case   Integer   of  
              0:   (longValue:   DWORD);  
              1:   (doubleValue:   Double);  
              2:   (largeValue:   Int64);  
              3:   (AnsiStringValue:   PChar);  
              4:   (WideStringValue:   PWideChar);  
      end;  
      TPDH_FMT_CouterValue   =   _PDH_FMT_COUNTERVALUE;  
     
  const  
      Pdh   =   'Pdh.dll';  
     
  function   PdhOpenQuery(szDataSource:   PChar;   dwUserData:   DWORD;  
      phQuery:   PHandle):   DWORD;   stdcall;   external   Pdh   name   'PdhOpenQueryA';  
     
  function   PdhAddCounter(hQuery:   THandle;   const   szFullCounterPath:   PChar;  
      dwUserData:   DWORD;   phCounter:   PHandle):  
      DWORD;   stdcall;   external   Pdh   name   'PdhAddCounterA';  
     
  function   PdhCollectQueryData(hQuery:   THandle):   DWORD;   stdcall;   external   Pdh   name   'PdhCollectQueryData';  
  function   PdhCloseQuery(hQuery:   THandle):   DWORD;   stdcall;   external   Pdh   name   'PdhCloseQuery';  
     
  function   PdhGetFormattedCounterValue(hCounter:   THandle;   dwFormat:   DWORD;  
      lpdwType:   PDWORD;   pValue:   PPDH_FMT_CouterValue):  
      DWORD;   stdcall;   external   Pdh   name   'PdhGetFormattedCounterValue';  
     
  const  
      CounterPath:   PChar   =   '\Processor(_Total)\%   Processor   Time';  
     
  type  
      TCpuUsage   =   class  
      private  
          FHandle:   THandle;  
          FCounter:   TPDHCounterStruct;  
          function   InitUsage:   Boolean;  
      public  
          constructor   Create;  
          destructor   Destroy;   override;  
          function   GetUsage:   Integer;  
      end;  
     
  {   TCpuUsage   }  
     
  constructor   TCpuUsage.Create;  
  begin  
      inherited   Create;  
      FHandle   :=   nil;  
      FillChar(FCounter,   Sizeof(FCounter),   0);  
      if   not   InitUsage   then  
          raise   Exception.Create(SysErrorMessage(GetLastError));  
  end;  
     
  destructor   TCpuUsage.Destroy;  
  begin  
      if   FHandle   <>   nil   then  
          PdhCloseQuery(FHandle);  
      inherited   Destroy;  
  end;  
     
  function   TCpuUsage.GetUsage:   Integer;  
  const  
      PDH_FMT_LONG   =   $100;  
  var  
      Formatted:   TPDH_FMT_CouterValue;  
  begin  
      if   ERROR_SUCCESS   <>   PdhCollectQueryData(FHandle)   then  
          raise   Exception.Create(SysErrorMessage(GetLastError));  
      if   PdhGetFormattedCounterValue(FCounter.hCounter,   PDH_FMT_LONG,  
          nil,   @Formatted)   =   ERROR_SUCCESS   then  
          Result   :=   Formatted.longValue  
      else  
          Result   :=   0;  
  end;  
     
  function   TCpuUsage.InitUsage:   Boolean;  
  begin  
      Result   :=   FHandle   <>   nil;  
      if   Result   then   Exit;  
      Result   :=   PdhOpenQuery(nil,   1,   @FHandle)   =   ERROR_SUCCESS;  
      if   not   Result   then   Exit;  
      Result   :=   PdhAddCounter(FHandle,   CounterPath,  
          DWORD(@FCounter),   @FCounter.hCounter)   =   ERROR_SUCCESS;  
  end;  
     
  var  
      Usage:   TCpuUsage   =   nil;  
     
  procedure   TForm1.Timer1Timer(Sender:   TObject);  
  begin  
      Memo1.Lines.Add(Format('CPU   Usage:   %d',   [Usage.GetUsage]))  
  end;  
     
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      Usage   :=   TCpuU  
  end;  
   
  end.  
   
  上面的程序是取CPU的使用频率的,但转成D老是有问题,但在CB中却是正常,请教了N人,  
  我的结果是:准备做成C的DLL。没办法了。  
   
  Top

18 楼muroachanf(阿远之哈儿)回复于 2004-12-17 08:58:04 得分 0

如果你把线程的优先级设置得高点,并且使用死循环的话,就会导致你的程序始终占用资源,如果你中途使用WaitForSingleObject,Sleep等等函数来等待或者暂缓线程的执行,则会释放资源,如果希望准确控制某线程在某时刻占用多少资源,应该说是没有这种可能的,WINDOWS是一个抢先任务式的操作系统,系统会随时在任意线程之间切换,唯一可以控制的,高优先级的线程优先执行。Top

19 楼ghchen()回复于 2004-12-17 08:59:52 得分 0

学习Top

20 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2004-12-17 09:07:15 得分 0

http://community.csdn.net/Expert/topicview.asp?id=3456772Top

21 楼muroachanf(阿远之哈儿)回复于 2004-12-17 09:35:08 得分 0

已修改  
  unit   Unit1;  
     
  interface  
     
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ExtCtrls,   StdCtrls;  
     
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Memo1:   TMemo;  
          Timer1:   TTimer;  
          procedure   Timer1Timer(Sender:   TObject);  
          procedure   FormCreate(Sender:   TObject);  
          procedure   Button1Click(Sender:   TObject);  
          //procedure   FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
     
  var  
      Form1:   TForm1;  
     
  implementation  
     
  {$R   *.dfm}  
     
  const  
      MAX_RAW_VALUES   =   20;  
     
  {$A-}  
  type  
      PHandle   =   ^THandle;  
     
      PPDH_RAW_COUNTER   =   ^TPDH_RAW_COUNTER;  
      _PDH_RAW_COUNTER   =   record  
          CStatus:   DWORD;  
          TimeStamp:   TFileTime;  
          FirstValue:   Int64;  
          SecondValue:   Int64;  
          MultiCount:   DWORD;  
      end;  
      TPDH_RAW_COUNTER   =   _PDH_RAW_COUNTER;  
     
      PPDHCounterStruct   =   ^TPDHCounterStruct;  
      _tag_PDHCounterStruct   =   record  
          hCounter:   THandle;             //   Handle   to   the   counter   -   given   to   use   by   PDH   Library  
          hNextIndex:   Integer;  
          nOldestIndex:   Integer;  
          nRawCount:   Integer;  
          RawValue:   array   [0..MAX_RAW_VALUES   -   1]   of   TPDH_RAW_COUNTER;  
      end;  
      TPDHCounterStruct   =   _tag_PDHCounterStruct;  
     
      PPDH_FMT_CouterValue   =   ^TPDH_FMT_CouterValue;  
      _PDH_FMT_COUNTERVALUE   =   record  
          CStatus:   DWORD;  
          case   Integer   of  
              0:   (longValue:   DWORD);  
              1:   (doubleValue:   Double);  
              2:   (largeValue:   Int64);  
              3:   (AnsiStringValue:   PChar);  
              4:   (WideStringValue:   PWideChar);  
      end;  
      TPDH_FMT_CouterValue   =   _PDH_FMT_COUNTERVALUE;  
     
  const  
      Pdh   =   'Pdh.dll';  
     
  function   PdhOpenQuery(szDataSource:   PChar;   dwUserData:   DWORD;  
      phQuery:   PHandle):   DWORD;   stdcall;   external   Pdh   name   'PdhOpenQueryA';  
     
  function   PdhAddCounter(hQuery:   THandle;   const   szFullCounterPath:   PChar;  
      dwUserData:   DWORD;   phCounter:   PHandle):  
      DWORD;   stdcall;   external   Pdh   name   'PdhAddCounterA';  
     
  function   PdhCollectQueryData(hQuery:   THandle):   DWORD;   stdcall;   external   Pdh   name   'PdhCollectQueryData';  
  function   PdhCloseQuery(hQuery:   THandle):   DWORD;   stdcall;   external   Pdh   name   'PdhCloseQuery';  
     
  function   PdhGetFormattedCounterValue(hCounter:   THandle;   dwFormat:   DWORD;  
      lpdwType:   PDWORD;   pValue:   PPDH_FMT_CouterValue):  
      DWORD;   stdcall;   external   Pdh   name   'PdhGetFormattedCounterValue';  
     
  var  
      CounterPath:   array   [1..MAX_PATH]   of   char;  
   
  type  
      TCpuUsage   =   class  
      private  
          FHandle:   THandle;  
          FCounter:   TPDHCounterStruct;  
          function   InitUsage:   Boolean;  
      public  
          constructor   Create;  
          destructor   Destroy;   override;  
          function   GetUsage:   Integer;  
      end;  
     
  {   TCpuUsage   }  
     
  constructor   TCpuUsage.Create;  
  begin  
      inherited   Create;  
      FHandle   :=   0;  
      FillChar(FCounter,   Sizeof(FCounter),   0);  
      if   not   InitUsage   then  
          raise   Exception.Create(SysErrorMessage(GetLastError));  
  end;  
     
  destructor   TCpuUsage.Destroy;  
  begin  
      if   FHandle   <>   0   then  
          PdhCloseQuery(FHandle);  
      inherited   Destroy;  
  end;  
     
  function   TCpuUsage.GetUsage:   Integer;  
  const  
      PDH_FMT_LONG   =   $100;  
  var  
      Formatted:   TPDH_FMT_CouterValue;  
  begin  
      if   ERROR_SUCCESS   <>   PdhCollectQueryData(FHandle)   then  
          raise   Exception.Create(SysErrorMessage(GetLastError));  
      if   PdhGetFormattedCounterValue(FCounter.hCounter,   PDH_FMT_LONG,  
          nil,   @Formatted)   =   ERROR_SUCCESS   then  
          Result   :=   Formatted.longValue  
      else  
          Result   :=   0;  
  end;  
     
  function   TCpuUsage.InitUsage:   Boolean;  
  begin  
      Result   :=   FHandle   <>   0;  
      if   Result   then   Exit;  
      Result   :=   PdhOpenQuery(nil,   0,   @FHandle)   =   ERROR_SUCCESS;  
      if   not   Result   then   Exit;  
      lstrcpy(@CounterPath[1],   '\Processor(_Total)\%   Processor   Time');  
      Result   :=   PdhAddCounter(FHandle,   @CounterPath[1],  
          0,   @FCounter.hCounter)   =   ERROR_SUCCESS;  
  end;  
     
  var  
      Usage:   TCpuUsage   =   nil;  
     
  procedure   TForm1.Timer1Timer(Sender:   TObject);  
  begin  
      Memo1.Lines.Add(Format('CPU   Usage:   %d',   [Usage.GetUsage]))  
  end;  
     
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      Usage   :=   TCpuUsage.Create  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Timer1.Enabled   :=   true;  
  end;  
   
  end.Top

22 楼Kshape(C/C++初学者~~~~)回复于 2004-12-31 17:08:49 得分 0

学习中Top

23 楼minimu(minimu)回复于 2005-01-04 09:13:02 得分 0

学习中  
   
  大家继续讨论,有好的结果另外开帖散分Top

相关问题

  • cpu使用率
  • SQL语句CPU使用率
  • 如何获得CPU使用率?
  • 如何获得CPU的使用率?
  • CPU使用率100%,怎么回事?
  • CPU使用率的问题,如何得到CPU当前的使用率?
  • 如果获得现在CPU的使用率,内存的使用率?请客位大侠帮忙。
  • 如何象Windows任务管理器一样得到某个进程的cpu使用率和内存使用率?
  • 请问LINUX下有没有查看CPU使用率的命令?
  • 为什么我的xp的cpu使用率老是100%

关键词

  • .net
  • cpu
  • 控制
  • 线程
  • sleep
  • 使用率
  • tpdh
  • pdh
  • 优先级
  • raw

得分解答快速导航

  • 帖主:minimu

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

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