Как узнать загрузку процессора?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как узнать загрузку процессора?

Сообщение makavka » 03.10.2009 21:04:41

Доброго времени суток!

Подскажите пожалуйста, как определить уровень загрузки процессора в текущий момент времени под управлением WinXP и Ubuntu 9.04?

Спасибо!
Аватара пользователя
makavka
незнакомец
 
Сообщения: 3
Зарегистрирован: 16.09.2009 13:10:42

Re: Как узнать загрузку процессора?

Сообщение carrots » 04.10.2009 01:11:23

В Linux это очень просто, через tprocess вызываем базовую команду линуха "top" и берем все что нужно.
С Windows наверное будет на много сложнее...

Добавлено спустя 8 минут 51 секунду:
Здесь есть пример на дельфи, как это сделать под винду, фрипаскаль должен потянуть...(сам не пробовал...)
http://www.aldyn.ru/products/cpu_usage/index.html
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Как узнать загрузку процессора?

Сообщение makavka » 04.10.2009 16:16:31

carrots спасибо за ссылку!

Проблема определения загрузки процессора в WinXp - решена. Пришлось немного изменить пример для делфи, а то фрипаскаль ругался.
Кому интересно -
uCpuUsage.zip

Чтоб заработало необходимо в параметрах компилятора указать -Sd. Вероятно необходимо быть осторожным с -Sd. Вот, что сказано в Free Pascal Users' manual:
-Sd Tells the compiler to be Delphi compatible. This is more strict than the -S2 option, since some fpc extensions are switched off.

carrots писал(а):В Linux это очень просто, через tprocess

Не могли бы вы рассказать подробнее как это сделать?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
makavka
незнакомец
 
Сообщения: 3
Зарегистрирован: 16.09.2009 13:10:42

Re: Как узнать загрузку процессора?

Сообщение Mr.Smart » 04.10.2009 16:56:05

makavka
Поищите по форуму TProcess. Буквально недавно данный вопрос поднимался.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Как узнать загрузку процессора?

Сообщение Attid » 04.10.2009 17:31:49

вместо
makavka писал(а):-Sd

можно вначале юнита написать {$MODE DELPHI} , это если например тебе надо использовать совместимость не во всех юнитах.

Добавлено спустя 1 минуту 8 секунд:
кстати ругалось скорее всего на руботу с указателями, если её передалать то будет и без режима дельфи собираться.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Как узнать загрузку процессора?

Сообщение carrots » 04.10.2009 22:45:05

Вот набросал в Лазаре пример.
Уровень нагрузки процессора пишется в переменную FCPUUsage
Дополнительно в лейбы пишу подробную информацию о процессоре, оперативке и свапе.
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, process;

type

  { TForm1 }

  TForm1 = class(TForm)
    LabelCPU: TLabel;
    LabelCPUUsage: TLabel;
    LabelMEM: TLabel;
    LabelSWAP: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    FTop: tprocess;
    FCPUUsage: single;
    FProcessOut: TStringList;
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  FProcessOut := TStringList.Create;
  FTop := TProcess.Create(Self);
  FTop.CommandLine := 'top -bcisSH';
  FTop.Options := FTop.Options + [poUsePipes, poStderrToOutPut, poDefaultErrorMode];
  FTop.Execute;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FProcessOut.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, i2: integer;
  s: String;
begin
  FProcessOut.AddStrings(FTop.Environment);
  if FTop.Output.NumBytesAvailable > 0 then
  begin
    FProcessOut.LoadFromStream(FTop.Output);
    for i := 0 to FProcessOut.Count-1 do
    begin
      if AnsiPos('Cpu(s):',FProcessOut.Strings[i]) > 0 then
      begin
        LabelCPU.Caption := FProcessOut.Strings[i];
        s := '';
        for i2:= 8 to 12 do
          s := s+ FProcessOut.Strings[i][i2];
        FCPUUsage := StrToFloat(StringReplace(s,' ','',[rfReplaceAll]));
        LabelCPUUsage.Caption:='CPU Usage: '+FloatToStr(FCPUUsage)+'%';
      end;
      if AnsiPos('Mem:',FProcessOut.Strings[i]) > 0 then LabelMEM.Caption := FProcessOut.Strings[i];
      if AnsiPos('Swap:',FProcessOut.Strings[i]) > 0 then LabelSWAP.Caption := FProcessOut.Strings[i];

    end;
  end;
end;

initialization
  {$I unit1.lrs}

end.   
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Как узнать загрузку процессора?

Сообщение makavka » 05.10.2009 01:32:45

Большое спасибо всем за ответы!!!
Все работает.

carrots спасибо за образец кода!

Mr.Smart писал(а):Поищите по форуму TProcess.

спасибо, поищу :wink:

Attid писал(а):кстати ругалось скорее всего на работу с указателями

ругалось именно на работу с указателями :D
Аватара пользователя
makavka
незнакомец
 
Сообщения: 3
Зарегистрирован: 16.09.2009 13:10:42


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

Рейтинг@Mail.ru