如何得知伺服器CPU忙碌程度 |
尚未結案
|
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
這有一篇 Get CPU Usage, 不知能不能用?
http://www.d-tnt.co.uk/readArticle.asp?id=3824&pg=4&cat=System&page=/delphitips.asp
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) Label1: TLabel; procedure Label1Click(Sender: TObject); procedure Label1DblClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; stop : boolean; implementation {$R *.DFM} function GetCPUSpeed: Double; const DelayTime = 500; // measure time in ms var TimerHi, TimerLo: DWORD; PriorityClass, Priority: Integer; begin PriorityClass := GetPriorityClass(GetCurrentProcess); Priority := GetThreadPriority(GetCurrentThread); SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); Sleep(10); asm dw 310Fh // rdtsc mov TimerLo, eax mov TimerHi, edx end; Sleep(DelayTime); asm dw 310Fh // rdtsc sub eax, TimerLo sbb edx, TimerHi mov TimerLo, eax mov TimerHi, edx end; SetThreadPriority(GetCurrentThread, Priority); SetPriorityClass(GetCurrentProcess, PriorityClass); Result := TimerLo / (1000.0 * DelayTime); end; procedure TForm1.Label1Click(Sender: TObject); begin Stop := False; while not Stop do begin label1.Caption := Format('CPU speed: %f MHz', [GetCPUSpeed]); Application.ProcessMessages; end; end; procedure TForm1.Label1DblClick(Sender: TObject); begin Stop := True; end; end.--- 這次沒買到 cd-pro2 實在很 ... |
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
|
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
http://www.swissdelphicenter.ch/torry/showcode.php?id=969
不知您要的是不是紅色的部份?
const SystemBasicInformation = 0; SystemPerformanceInformation = 2; SystemTimeInformation = 3; type TPDWord = ^DWORD; TSystem_Basic_Information = packed record dwUnknown1: DWORD; uKeMaximumIncrement: ULONG; uPageSize: ULONG; uMmNumberOfPhysicalPages: ULONG; uMmLowestPhysicalPage: ULONG; uMmHighestPhysicalPage: ULONG; uAllocationGranularity: ULONG; pLowestUserAddress: Pointer; pMmHighestUserAddress: Pointer; uKeActiveProcessors: ULONG; bKeNumberProcessors: byte; bUnknown2: byte; wUnknown3: word; end; type TSystem_Performance_Information = packed record liIdleTime: LARGE_INTEGER; {LARGE_INTEGER} dwSpare: array[0..75] of DWORD; end; type TSystem_Time_Information = packed record liKeBootTime: LARGE_INTEGER; liKeSystemTime: LARGE_INTEGER; liExpTimeZoneBias: LARGE_INTEGER; uCurrentTimeZoneId: ULONG; dwReserved: DWORD; end; var NtQuerySystemInformation: function(infoClass: DWORD; buffer: Pointer; bufSize: DWORD; returnSize: TPDword): DWORD; stdcall = nil; liOldIdleTime: LARGE_INTEGER = (); liOldSystemTime: LARGE_INTEGER = (); function Li2Double(x: LARGE_INTEGER): Double; begin Result := x.HighPart * 4.294967296E9 x.LowPart end; procedure GetCPUUsage; var SysBaseInfo: TSystem_Basic_Information; SysPerfInfo: TSystem_Performance_Information; SysTimeInfo: TSystem_Time_Information; status: Longint; {long} dbSystemTime: Double; dbIdleTime: Double; bLoopAborted : boolean; begin if @NtQuerySystemInformation = nil then NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQuerySystemInformation'); // get number of processors in the system status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil); if status <> 0 then Exit; // Show some information with SysBaseInfo do begin ShowMessage( Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13 'uMmNumberOfPhysicalPages: %d' #13 'uMmLowestPhysicalPage: %d' #13 'uMmHighestPhysicalPage: %d' #13 'uAllocationGranularity: %d'#13 'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d', [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages, uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity, uKeActiveProcessors, bKeNumberProcessors])); end; bLoopAborted := False; while not bLoopAborted do begin // get new system time status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0); if status <> 0 then Exit; // get new CPU's idle time status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil); if status <> 0 then Exit; // if it's a first call - skip it if (liOldIdleTime.QuadPart <> 0) then begin // CurrentValue = NewValue - OldValue dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); // CurrentCpuIdle = IdleTime / SystemTime dbIdleTime := dbIdleTime / dbSystemTime; // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors 0.5; // Show Percentage Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime); Application.ProcessMessages; // Abort if user pressed ESC or Application is terminated bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated; end; // store new CPU's idle and system time liOldIdleTime := SysPerfInfo.liIdleTime; liOldSystemTime := SysTimeInfo.liKeSystemTime; // wait one second Sleep(1000); end; end; procedure TForm1.Button1Click(Sender: TObject); begin GetCPUUsage end;--- 這次沒買到 cd-pro2 實在很 ... |
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
小弟用 Delphi 5, 是可以 compile
ULONG 和 LARGE_INTEGER 定義在 window.pas, 截錄如下:
{$EXTERNALSYM PUINT} ULONG = Cardinal; {$EXTERNALSYM ULONG} ... type LONGLONG = Int64; {$EXTERNALSYM LONGLONG} PSID = Pointer; {$EXTERNALSYM PSID} PLargeInteger = ^TLargeInteger; _LARGE_INTEGER = record case Integer of 0: ( LowPart: DWORD; HighPart: Longint); 1: ( QuadPart: LONGLONG); end; {$EXTERNALSYM _LARGE_INTEGER} {$NODEFINE TLargeInteger} TLargeInteger = Int64; LARGE_INTEGER = _LARGE_INTEGER; {$EXTERNALSYM LARGE_INTEGER}--- 這次沒買到 cd-pro2 實在很 ... |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |