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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2010, 14:07   #1
medved6216
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 56
По умолчанию Отслеживание процесса

Здравствуйте, написал программу по отслеживанию процессов, возникла проблема - она сжирает очень много памяти, каждые секунду по 5 мегабайт
Помогите решить проблему...

Вот код:
Код:
function FindProcess(const ExeFile: string): string;
const
  TH32CS_SNAPPROCESS  = $00000002;
var
  SH: THandle;
  TP: TProcessEntry32;
  PID: DWORD;
  I: Integer;
  S: string;
begin
  Result := '';
  if ExeFile = '' then Exit;
  SH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Integer(SH) < 0 then Exit;
  TP.dwSize := SizeOf(TProcessEntry32);
  if not Process32First(SH, TP) then Exit;
  PID := 0;
  for I := 0 to 999 do
  begin
    S := UpperCase(TP.szExeFile);
    if SameText(ExeFile, S) then
    begin
      PID := TP.th32ProcessID;
      Break;
    end;
    if not Process32Next(SH, TP) then Break;
  end;
  if PID = 0 then Exit;
  Result := S;
end; 

procedure TForm1.Timer1Timer(Sender: TObject);
var
a: string;
m: string;
s: string;
d: string;
begin
a:=FindProcess('a.exe');
m:=FindProcess('m.exe');
s:=FindProcess('s.exe');
d:=FindProcess('d.exe');
if a <> '' then
begin
edit3.Font.Color:=clgreen;
edit3.Text:='1';
end
else
begin
edit3.Font.Color:=clred;
edit3.Text:='12';
end;

if m <> '' then
begin
edit4.Font.Color:=clgreen;
edit4.Text:='1';
end
else
begin
edit4.Font.Color:=clred;
edit4.Text:='12';
end;

if s <> '' then
begin
edit5.Font.Color:=clgreen;
edit5.Text:='1';
end
else
begin
edit5.Font.Color:=clred;
edit5.Text:='12';
end;
if d <> '' then
begin
  if edit3.text='1' then
    begin
      if edit4.text='1' then
        begin
          if edit5.text='1' then
            begin
              edit1.font.color:=clgreen;
              edit1.text:='87';
            end
            else
    begin
      edit1.Font.Color:=clred;
      edit1.Text:='54';
    end;
        end
        else
    begin
      edit1.Font.Color:=clred;
      edit1.Text:='24';
    end;
    end
  else
    begin
      edit1.Font.Color:=clred;
      edit1.Text:='13';
    end;
end
else
begin
edit1.Font.Color:=clred;
edit1.Text:='123';
end;
end;
medved6216 вне форума Ответить с цитированием
Старый 17.03.2010, 20:38   #2
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

Получайте список процессов в список (например в Listbox) и потом по Listbox'у бегайте с поиском
Код:
 for i:=0 to listbox1.items.count-1 do 
if listbox1.items.string[i]='a.exe' then....
Я вот недавно сталкивался с этой проблемой. Если нужен будет код, я покажу...но идея вроде понятна.
prizrak1390 вне форума Ответить с цитированием
Старый 18.03.2010, 09:00   #3
medved6216
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 56
По умолчанию

prizrak1390, если не сложно скинь код
medved6216 вне форума Ответить с цитированием
Старый 22.03.2010, 20:17   #4
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

Без проблем...
Значит есть такая вот функа:
Код:
function processlist:Tstringlist;
var
han : THandle;
ProcStruct : PROCESSENTRY32; // from "tlhelp32" in uses clause
sID : string;
begin
processlist:=Tstringlist.Create;
// Get a snapshot of the system
han := CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );
if han = 0 then
   exit;
// Loop thru the processes until we find it or hit the end
ProcStruct.dwSize := sizeof( PROCESSENTRY32 );
if Process32First( han, ProcStruct ) then
   begin
     repeat
       sID := ExtractFileName( ProcStruct.szExeFile );
processlist.Add(sid);


     until not Process32Next( han, ProcStruct );
   end;
// clean-up
CloseHandle( han );
end;
И допустим у нас есть на форме компонент Listbox (Или любой другой, аналогичный компонент-список)

К примеру хочешь ты получать список процессов с интервалом,для этого в Timer вписываешь вот такую конструкцию:

Код:
listbox1.Items.Text:=processlist.Text;
Затем в button пишем такую конструкцию:
...
Код:
var
 i:integer;
  begin
 for i:=0 to listobx1.items.count-1 do begin
 if listbox1.items.strings[i]='winamp.exe' then showmessage('Winamp, found!');
 end;
...

Последний раз редактировалось prizrak1390; 22.03.2010 в 20:25. Причина: доПИсал
prizrak1390 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отслеживание процесса написания программы Buravsic Софт 17 19.07.2009 15:41
Отслеживание движущихся объектов Impuls1989 Общие вопросы C/C++ 2 29.06.2009 00:21
отслеживание нажатий клавиш Артэс Win Api 6 14.06.2008 20:02
Отслеживание сети Antoha_Gad Работа с сетью в Delphi 5 09.04.2008 15:56
отслеживание загрузки программы ГОСЕАН Общие вопросы Delphi 4 13.12.2007 18:04