На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> CPU Usage Процесса
    Как определить в % сколько определенный процесс кушает у проца?
    Вариант с функцией
    ExpandedWrap disabled
      function NtQuerySystemInformation(dwSystemInformationClass: DWORD;
                                       pSystemInformation: Pointer;
                                       dwSystemInformationLength: DWORD;
                                       var iReturnLength:DWORD): NTSTATUS;
                                       stdcall;external 'ntdll.dll';


    не прокатывает. В API ничего не нашел по этому поводу.
    В интернетак так же нарыл пару примеров но не то=(
    Хочется чтобы была максимальная совместимасть со всеми версиями ОС.
    Может вы знаете с какого бока подойти?
      Если не хочешь работать через NtQuerySystemInformation тогда работай через счетчики производительности, например через "Process\% Processor Time"
        какими функциями пользоваться? :huh:
            Ищи статьи в которых описывается использование WMI для доступа к счетчикам производительности.
                видел примеры с WMI, но он так же не нужен

                Добавлено
                ElcnU там пример на си, я его не в состоянии перевести на delphi%)
                Сообщение отредактировано: oneday -
                  Цитата oneday @
                  ElcnU там пример на си, я его не в состоянии перевести на delphi%)

                  Весь пример там заключается в вызове GetProcessTimes.
                    CodeMonkey, да видимо все не так сложно, попробую таки перевести этот кусок
                      Цитата
                      Весь пример там заключается в вызове GetProcessTimes.

                      Здесь тоже, но на pas-е. Обращение к процессу по его PID.
                      % делится на количество процессоров. Ничего лучшего не придумал. Есть идеи?
                      Есть еще обращение по имени процесса, ИМХО - лажа ;) , хотя работает, если имя одно.

                      ExpandedWrap disabled
                        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;
                        abyss_by, спасибо, прям в точку, использует все стандартное, ни о каких dll не надо заботиться, и без WMI. Гланое есть совместимость с NT, а больше ниче и не надо)
                          ...а performance counters тоже без WMI вообще-то...
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0379 ]   [ 16 queries used ]   [ Generated: 5.05.24, 02:53 GMT ]