Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2013, 13:32   #1
evgedosha
 
Регистрация: 26.02.2013
Сообщений: 3
Вопрос секундомер процессов

Добрый день прошу помощи, мне нужно сделать секундомер процессов, я смог сделать для одного процесса по выбору, а мне нужно что бы секундомер работал сразу для нескольких процессов (например из списка в мемо/листбокс) т.е свой секундомер для каждого процесса из списка(что бы в итоге получилось в таком виде в (мемо/листбоксе)
explorer.ехе - 0.00.00
iexplore.exe - 0.00.00
chrome.exe- 0.00.00
вот код который я сделал для одного процесса:
Код:
var
  Form1: TForm1;
  time: integer = 0;
   i, i1: real;
implementation

function processExists(exeFileName: string): Boolean;
var
    ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;

begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    Result := False;
    while Integer(ContinueLoop) <> 0 do
    begin
      if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
        UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
        UpperCase(ExeFileName))) then
      begin
        Result := True;
      end;
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
end;



{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);

begin
i:=i+1;
i1:=i / (24*3600);
  Label1.Caption:=FormatDateTime('hh:nn:ss', i1);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
    if processExists(edit1.text) then
   begin
     Timer1.Enabled:=true;
     end
           else
       Timer1.Enabled:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:integer;
begin

if edit1.Text= EmptyStr then
showmessage ('vvedite process')
else
timer2.Enabled:=true;
end;

Последний раз редактировалось evgedosha; 26.02.2013 в 13:35.
evgedosha вне форума Ответить с цитированием
Старый 26.02.2013, 15:05   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Пряморукий способ - http://www.codeproject.com/Articles/...etProcessTimes
Криворукий способ - добавляем список процессов и, вместо поиска конкретного процесса, ищем его в списке нашем, добавляем при необходимости, и обновляем его таймер

точнее сказать не могу т.к. лень прогу писать... пиши вопросы, что не ясно
GreenWizard вне форума Ответить с цитированием
Старый 26.02.2013, 15:32   #3
evgedosha
 
Регистрация: 26.02.2013
Сообщений: 3
По умолчанию

пример хороший как раз как мне нужно только мне достаточно одной колонки running time, но там я так понимаю Си, а я ни бум бум в нем, вообще только начинаю так сказать, осваиваю делфи, про криворукий способ что то не понял( или ты не так понял) мне нужно что бы в списке процессов у каждого считалось время, как в том примере, что ты кинул
evgedosha вне форума Ответить с цитированием
Старый 26.02.2013, 16:23   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Много вариантов реализации есть)) я просто не знаю какой предпочтительнее, а все описывать - лень и долго
вот основной код (псевдокод):
Код:
function processExists(exeFileName: string): Boolean;
var
    ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;

begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    Result := False;
    while Integer(ContinueLoop) <> 0 do
    begin
      if not ПроверкаЕстьЛиПроцессВСписке(FProcessEntry32) then
      begin
        ДобавляемПроцесс;
        УстановитьТаймерРаботы(FProcessEntry32, 0);
      end
      else
         УвеличитьТаймерРаботы(FProcessEntry32);
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
end;
Вот реализация этих 3 ф-ий сильно зависит от многих факторов (где храним список? как? и т.д.)
GreenWizard вне форума Ответить с цитированием
Старый 26.02.2013, 16:29   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Криворукий способ - добавляем список процессов и, вместо поиска конкретного процесса, ищем его в списке нашем, добавляем при необходимости, и обновляем его таймер
0. убираем все глобальные переменные (кроме Form1: TForm1
Код:
var
  Form1: TForm1;
//  time: integer = 0;
//   i, i1: real;
1. определяем информацию необходимую для одного процесса
Код:
type TcontrolProcess =record nameprocess: string; timer: TTime; end;
2. составляем список процессов
Код:
contorolProsess: array of TContolProcess;
3. реализуем добавление процесса в список.
Код:
Tform1 =class
....
public
  procedure AddProcess(const processname: string);
....
end;

procedure TForm1.AddProcess(const processname: string);
begin
  currentlength:=Length(controlProcess);
  SetLength(controlProcess, currentlength+1);
  controlProcess[currentlength].nameprocess:=processname;
  controlProcess[currentlength].timer1:=0;
end;
Теперь чтобы добавить надо где-то вызвать
AddProcess(<и указать какой процесс хотим добавить>);
Где и как вызвать AddProcess? к примеру добавить кнопку и при ее нажатии
Код:
procedure Tform1.buttonOnclick(sender: TObject);
begin
   AddProcess(self.Edit1.Text); //добавить процесс с именем введеным в Edit
end;
а можно сразу при старте заполнить
Код:
procedure Tform1.formCreate(sender: TObject);
begin
   AddProcess('exporer.exe');
  AddProcess('FireFox.exe');
end;
4. там где мы периодически опрашивали один процесс делаем опрос всех потоков из нашего списка.
Код:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
   timer2.enabled:=false; //хороший тон если мы не уверены что успеем все проверить до след. "звонка" тоотключим "звонок" 
    
  try //чтобы быть уверенными что в конце звонок будет включен 
   for j:=0 to length(controlProcess)-1 do begin
    if processExists(controlProcess[j].nameprocess) then
     controlProcess[j].timer1:=controlProcess[j].timer1+1;
     // и можем тут же вывести если будем знать куда
     controlProcess[j].MyInfoLabel.Caption:=formatdatetime(controlProcess[j].timer1, 'hh:mm:ss');
   end;
   finally // чтобы не случилось звонок надо все равно включить
   timer2.enabled:=true; //мы все сделали и теперь можно включить звонок
   end;
end;
чтобы знать куда выводить изменяем
п.1.
Код:
type TcontrolProcess =record nameprocess: string; timer: TTime; mynfolabel: Tlabel; end;
п.3.
Код:
  controlProcess[currentlength].nameprocess:=processname;
  controlProcess[currentlength].timer1:=0;
  controlProcess[currentLength].MyInfoLabel:=LabelXXX';
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.02.2013, 16:34   #6
evgedosha
 
Регистрация: 26.02.2013
Сообщений: 3
По умолчанию

Спасибо буду разбираться.
evgedosha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание задания, добавление процессов, удаление процессов RAZOR1703 Win Api 12 16.02.2012 18:07
Секундомер на С++!!! JOHNY26RUS Помощь студентам 4 26.05.2011 11:13
Секундомер aesoem Общие вопросы Delphi 10 28.01.2008 19:25