Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.13.255] |
|
Сообщ.
#1
,
|
|
|
Как определить в % сколько определенный процесс кушает у проца?
Вариант с функцией function NtQuerySystemInformation(dwSystemInformationClass: DWORD; pSystemInformation: Pointer; dwSystemInformationLength: DWORD; var iReturnLength:DWORD): NTSTATUS; stdcall;external 'ntdll.dll'; не прокатывает. В API ничего не нашел по этому поводу. В интернетак так же нарыл пару примеров но не то=( Хочется чтобы была максимальная совместимасть со всеми версиями ОС. Может вы знаете с какого бока подойти? |
Сообщ.
#2
,
|
|
|
Если не хочешь работать через NtQuerySystemInformation тогда работай через счетчики производительности, например через "Process\% Processor Time"
|
Сообщ.
#3
,
|
|
|
какими функциями пользоваться?
|
Сообщ.
#4
,
|
|
|
Как измерить степень загруженности процессора (сообщение #2198174)
6й пост, вроде был какой то пример |
Сообщ.
#5
,
|
|
|
Ищи статьи в которых описывается использование WMI для доступа к счетчикам производительности.
|
Сообщ.
#7
,
|
|
|
видел примеры с WMI, но он так же не нужен
Добавлено ElcnU там пример на си, я его не в состоянии перевести на delphi%) |
Сообщ.
#8
,
|
|
|
Цитата oneday @ ElcnU там пример на си, я его не в состоянии перевести на delphi%) Весь пример там заключается в вызове GetProcessTimes. |
Сообщ.
#9
,
|
|
|
CodeMonkey, да видимо все не так сложно, попробую таки перевести этот кусок
|
Сообщ.
#10
,
|
|
|
Цитата Весь пример там заключается в вызове GetProcessTimes. Здесь тоже, но на pas-е. Обращение к процессу по его PID. % делится на количество процессоров. Ничего лучшего не придумал. Есть идеи? Есть еще обращение по имени процесса, ИМХО - лажа , хотя работает, если имя одно. unit uCpuUsage; interface const wsMinMeasurementInterval=250; {minimum amount of time that must have elapsed to calculate CPU usage, miliseconds. If time elapsed is less than this, previous result is returned, or zero, if there is no previous result.} type PInt64 = type Int64; DWord64 = -1..High(PInt64); TCPUUsageData=record PID,Handle:cardinal; oldUser,oldKernel:DWord64; LastUpdateTime:cardinal; LastUsage:single; //Last result of wsGetCpuUsage is saved here Tag:cardinal; //Use it for anythin you like, not modified by this unit end; PCPUUsageData=^TCPUUsageData; function GetProcessorsCount:Byte; function wsCreateUsageCounter(PID:cardinal):PCPUUsageData; function wsGetCpuUsage(aCounter:PCPUUsageData):single; procedure wsDestroyUsageCounter(aCounter:PCPUUsageData); implementation uses Windows; var ProcessorsCount: Byte; function GetProcessorsCount:Byte; var SYSINFO:SYSTEM_INFO; begin GetSystemInfo(SYSINFO); Result:=SYSINFO.dwNumberOfProcessors; end; function wsCreateUsageCounter(PID:cardinal):PCPUUsageData; var p:PCPUUsageData; mCreationTime,mExitTime,mKernelTime, mUserTime:_FILETIME; h:cardinal; begin result:=nil; //We need a handle with PROCESS_QUERY_INFORMATION privileges h:=OpenProcess(PROCESS_QUERY_INFORMATION,false,PID); if h=0 then exit; new(p); p.PID:=PID; p.Handle:=h; p.LastUpdateTime:=GetTickCount; p.LastUsage:=0; if GetProcessTimes(p.Handle, mCreationTime, mExitTime, mKernelTime, mUserTime) then begin //convert _FILETIME to Int64 p.oldKernel:=DWord64(mKernelTime.dwLowDateTime or (mKernelTime.dwHighDateTime shr 32)); p.oldUser:=DWord64(mUserTime.dwLowDateTime or (mUserTime.dwHighDateTime shr 32)); Result:=p; end else begin dispose(p); end; end; procedure wsDestroyUsageCounter(aCounter:PCPUUsageData); begin CloseHandle(aCounter.Handle); dispose(aCounter); end; function wsGetCpuUsage(aCounter:PCPUUsageData):single; var mCreationTime,mExitTime,mKernelTime, mUserTime:_FILETIME; DeltaMs,ThisTime: cardinal; mKernel,mUser,mDelta: DWord64; begin result:=aCounter.LastUsage; ThisTime:=GetTickCount; //Get the time elapsed since last query DeltaMs:=ThisTime-aCounter.LastUpdateTime; if DeltaMs < wsMinMeasurementInterval then exit; aCounter.LastUpdateTime:=ThisTime; GetProcessTimes(aCounter.Handle,mCreationTime, mExitTime, mKernelTime, mUserTime); //convert _FILETIME to Int64. mKernel:=DWord64(mKernelTime.dwLowDateTime or (mKernelTime.dwHighDateTime shr 32)); mUser:=DWord64(mUserTime.dwLowDateTime or (mUserTime.dwHighDateTime shr 32)); //get the delta mDelta:=mUser+mKernel-aCounter.oldUser-aCounter.oldKernel; aCounter.oldUser:=mUser; aCounter.oldKernel:=mKernel; Result:=(mDelta/DeltaMs) / 100 / ProcessorsCount;//divide by the amount of processors //mDelta is in units of 100 nanoseconds, so: aCounter.LastUsage:=Result; //just in case you want to use it later, too end; initialization ProcessorsCount:= GetProcessorsCount; end. //Example //Дополнительные комметарии, думаю, излишни var CounterData: PCPUUsageData; CPUse: Single; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Interval:= 1000; if Assigned(CounterData) then wsDestroyUsageCounter(CounterData); CounterData:=wsCreateUsageCounter(PID); end; procedure TForm1.Timer1Timer(Sender: TObject); begin CPUse:= wsGetCpuUsage(CounterData); end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(CounterData) then wsDestroyUsageCounter(CounterData); end; |
Сообщ.
#11
,
|
|
|
abyss_by, спасибо, прям в точку, использует все стандартное, ни о каких dll не надо заботиться, и без WMI. Гланое есть совместимость с NT, а больше ниче и не надо)
|
Сообщ.
#12
,
|
|
|
...а performance counters тоже без WMI вообще-то...
|