超难:如何控制CPU使用率,大家一起讨论;如可解决,可以加分到300~1000
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




