نقل قول: CPU Usage در ویندوز 11
با سلام
من در ویندوز 10 نتونستم از این کد استفاده نمایم. برای مثال "numProcesses" شناسایی نمیشه. شاید متغیرهایی باید به کد اضافه شود.متشکرم
1 ضمیمه
نقل قول: CPU Usage در ویندوز 11
این سورس برنامه هست.
دوستان ببینید و راهنمایی بفرمایید لطفا
نقل قول: CPU Usage در ویندوز 11
uses PsAPI;
function GetProcessCpuUsage(ProcessID: DWORD): Double;
var
hProcess: THandle;
ProcessMemoryCounters: TProcessMemoryCounters;
CreationTime, ExitTime, KernelTime, UserTime: TFileTime;
TotalTime: Int64;
SystemTime: TSystemTime;
begin
Result := 0.0;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
if hProcess <> 0 then
begin
try
GetProcessTimes(hProcess, CreationTime, ExitTime, KernelTime, UserTime);
TotalTime := (Int64(UserTime.dwHighDateTime) shl 32 + UserTime.dwLowDateTime) +
(Int64(KernelTime.dwHighDateTime) shl 32 + KernelTime.dwLowDateTime);
GetSystemTime(SystemTime);
Result := TotalTime / (SystemTime.wHour * 3600 + SystemTime.wMinute * 60 + SystemTime.wSecond);
finally
CloseHandle(hProcess);
end;
end
else
raise Exception.Create('Could not open process.');
end;
procedure TForm1.Button1Click(Sender: TObject);
var PUsage: Double;
ProcessID: DWORD;
begin
PUsage := GetProcessCpuUsage(ProcessID);
end;
نقل قول: CPU Usage در ویندوز 11
سلام و تشکر از ارسال پاسختون:تشویق:
با استفاده از دستورات شما ، خروجی عددیست که با هر بار مقدارش اضاف میشه و CPU Usage رو نشون نمیده.
فک کنم خروجی دستورات شما پروسس تایم را میدهد نه پروسس یوزیج.:متفکر:
نقل قول: CPU Usage در ویندوز 11
نقل قول:
نوشته شده توسط
seyed_farid
سلام و تشکر از ارسال پاسختون:تشویق:
با استفاده از دستورات شما ، خروجی عددیست که با هر بار مقدارش اضاف میشه و CPU Usage رو نشون نمیده.
فک کنم خروجی دستورات شما پروسس تایم را میدهد نه پروسس یوزیج.:متفکر:
اینم یه تست بزن:
uses
PSAPI, TlHelp32;
Function EnumThreadProc( wnd: HWND; Var appHwnd: HWND ): LongBool;
stdcall;
Var
buf: array [0..128] of Char;
Begin
Result := LongBool(1);
if GetClassname( wnd, buf, sizeof(buf)) > 0 then
If StrComp( buf, 'TApplication' ) = 0 Then Begin
appHwnd := Wnd;
Result := False;
End;
End;
Function FindApplicationWindow( forThreadID: DWORD ): HWND;
Begin
Result := 0;
EnumThreadWindows( forThreadID, @EnumThreadProc, lparam(@result));
End;
Function ProcessIDFromAppName( appname: String ): DWORD;
{ Take only the application filename, not full path! }
Var
snapshot: THandle;
processEntry : TProcessEntry32;
Begin
Result := 0;
appName := UpperCase( appname );
snapshot := CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS,
0 );
If snapshot <> 0 Then
try
processEntry.dwSize := Sizeof( processEntry );
If Process32First( snapshot, processEntry ) Then
Repeat
If Pos(appname,
UpperCase(ExtractFilename(
StrPas(processEntry.szExeFile)))) > 0
Then Begin
Result:= processEntry.th32ProcessID;
Break;
End; { If }
Until not Process32Next( snapshot, processEntry );
finally
CloseHandle( snapshot );
End; { try }
End;
function GetCpuUsage(PID:cardinal):single;
var
hProcess: Cardinal;
mCreationTime,mExitTime,mKernelTime, mUserTime: _FILETIME;
TotalTime1,TotalTime2: Int64;
SysInfo : _SYSTEM_INFO;
CpuCount: Word;
begin
GetSystemInfo(SysInfo);
CpuCount := SysInfo.dwNumberOfProcessors;
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID);
if hProcess <> 0 then
begin
try
GetProcessTimes(hProcess,mCreationTime,mExitTime,m KernelTime,mUserTime);
TotalTime1:=(Int64(mUserTime.dwHighDateTime) shl 32 + mUserTime.dwLowDateTime) +
(Int64(mKernelTime.dwHighDateTime) shl 32 + mKernelTime.dwLowDateTime);
Sleep(750);
GetProcessTimes(hProcess,mCreationTime,mExitTime,m KernelTime,mUserTime);
TotalTime2:=(Int64(mUserTime.dwHighDateTime) shl 32 + mUserTime.dwLowDateTime) +
(Int64(mKernelTime.dwHighDateTime) shl 32 + mKernelTime.dwLowDateTime);
Result:=((TotalTime2-TotalTime1)/750)/100/CpuCount;
finally
CloseHandle(hProcess);
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
CPU: Single;
PName: string;
begin
PName:= 'bds';
CPU := GetCpuUsage(ProcessIDFromAppName(PName));
Label1.Caption := FormatFloat('0%', CPU);
end;
نقل قول: CPU Usage در ویندوز 11
نقل قول:
نوشته شده توسط
دلفــي
اینم یه تست بزن:
uses
PSAPI, TlHelp32;
Function EnumThreadProc( wnd: HWND; Var appHwnd: HWND ): LongBool;
stdcall;
Var
buf: array [0..128] of Char;
Begin
Result := LongBool(1);
if GetClassname( wnd, buf, sizeof(buf)) > 0 then
If StrComp( buf, 'TApplication' ) = 0 Then Begin
appHwnd := Wnd;
Result := False;
End;
End;
Function FindApplicationWindow( forThreadID: DWORD ): HWND;
Begin
Result := 0;
EnumThreadWindows( forThreadID, @EnumThreadProc, lparam(@result));
End;
Function ProcessIDFromAppName( appname: String ): DWORD;
{ Take only the application filename, not full path! }
Var
snapshot: THandle;
processEntry : TProcessEntry32;
Begin
Result := 0;
appName := UpperCase( appname );
snapshot := CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS,
0 );
If snapshot <> 0 Then
try
processEntry.dwSize := Sizeof( processEntry );
If Process32First( snapshot, processEntry ) Then
Repeat
If Pos(appname,
UpperCase(ExtractFilename(
StrPas(processEntry.szExeFile)))) > 0
Then Begin
Result:= processEntry.th32ProcessID;
Break;
End; { If }
Until not Process32Next( snapshot, processEntry );
finally
CloseHandle( snapshot );
End; { try }
End;
function GetCpuUsage(PID:cardinal):single;
var
hProcess: Cardinal;
mCreationTime,mExitTime,mKernelTime, mUserTime: _FILETIME;
TotalTime1,TotalTime2: Int64;
SysInfo : _SYSTEM_INFO;
CpuCount: Word;
begin
GetSystemInfo(SysInfo);
CpuCount := SysInfo.dwNumberOfProcessors;
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID);
if hProcess <> 0 then
begin
try
GetProcessTimes(hProcess,mCreationTime,mExitTime,m KernelTime,mUserTime);
TotalTime1:=(Int64(mUserTime.dwHighDateTime) shl 32 + mUserTime.dwLowDateTime) +
(Int64(mKernelTime.dwHighDateTime) shl 32 + mKernelTime.dwLowDateTime);
Sleep(750);
GetProcessTimes(hProcess,mCreationTime,mExitTime,m KernelTime,mUserTime);
TotalTime2:=(Int64(mUserTime.dwHighDateTime) shl 32 + mUserTime.dwLowDateTime) +
(Int64(mKernelTime.dwHighDateTime) shl 32 + mKernelTime.dwLowDateTime);
Result:=((TotalTime2-TotalTime1)/750)/100/CpuCount;
finally
CloseHandle(hProcess);
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
CPU: Single;
PName: string;
begin
PName:= 'bds';
CPU := GetCpuUsage(ProcessIDFromAppName(PName));
Label1.Caption := FormatFloat('0%', CPU);
end;
ممنونم مهندس جان:قلب:
ولی
این همون دستورات ارسال اول هست که خودم ارسال کردم دیگه.
مشکل اینه که مقادیر حاصله با مقادیر نمایش داده شده در تسک منیجر ویندوز فرق داره.
در ویندوز 10 فرقش خیلی نیست ولی در 11 خیلی متفاوت هست.
اساتید محترم هم یه مشارکت بفرمائید تا به کدهای صحیح برسیم. :تشویق::تشویق::تشویق:
نقل قول: CPU Usage در ویندوز 11
نقل قول:
نوشته شده توسط
seyed_farid
این سورس برنامه هست.
دوستان ببینید و راهنمایی بفرمایید لطفا
این کدها باز شدند براتون؟
نقل قول: CPU Usage در ویندوز 11
از کامپوننت Mitec استفاده کن
اینجا هم دمو رو میتونی ببینی: https://www.mitec.cz/tmx.html
نقل قول: CPU Usage در ویندوز 11
نقل قول:
نوشته شده توسط
دلفــي
این کامپوننت دلفی 7 رو ساپورت نمیکه ظاهرا.
راه دیگه ای نیست برای بدست آوردن مقدار CPU در ویندوز 11 ؟؟؟
1 ضمیمه
نقل قول: CPU Usage در ویندوز 11
مشکل موقعی پیش میاد که برنامه ما As Admin نباشه و بخواهیم پروسس یک برنامه که As Admin اجرا شده رو بدست بیاریم.
در حالت عادی مشکلی نداره.
دوستان برخورد نکردید با این مورد؟
سورس جدید رو ببینید.
نقل قول: CPU Usage در ویندوز 11
وقتی سطح دسترسی واکشی اطلاعات در سطح ادمین رو ندارید که نمیشه معجزه کرد.خب سطح دسترسی بدید به برنامتون.
نقل قول: CPU Usage در ویندوز 11
با سلام و تشکر از پاسختون:قلب:
خوب مشکل با ویندوزهای جدید هست دیگه
که اجازه نمیدند برنامه رو با دسترسی ادمین تو استارت آپ ویندوز قرار بدی.:افسرده:
راه کار حل این مشکل چیه؟
من خیلی تو سایتهای مختلف جستجو کردم، هر کسی یه راهکاری داده ولی تو آپدیدتهای جدید ویندوز جواب نمیدند.:گریه:
اساتید سایت لطفا راهنمایی بفرمائید.:تشویق::تشویق::تشوی ق:
نقل قول: CPU Usage در ویندوز 11
نقل قول:
نوشته شده توسط
seyed_farid
این کامپوننت دلفی 7 رو ساپورت نمیکه ظاهرا.
راه دیگه ای نیست برای بدست آوردن مقدار CPU در ویندوز 11 ؟؟؟
این نسخه از دلفی 7 هم پشتیبانی میکنه:
MiTeC System Information Component Suite 12.4.0 for D7-D10.2