Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Процессы   Найти похожие ветки 

 
Grief ©   (2005-08-10 22:56) [0]

Как получить список всех процессов - раз, как узнать расход процессора и памяти на них два. Плюс если еще чтото по процессу можно узнать - тоже можете сказать. Спасибо.


 
Digitman ©   (2005-08-11 08:30) [1]

1. Под НТ - см. psapi.pas (EnumProcesses), под Win9x - см. tlhelp32.pas (CreateToolhelp32Snapshot, Process32First/Next)

2.  GetProcessWorkingSetSize()

3. Что конкретно ?


 
Kazakh   (2005-08-11 10:19) [2]

Получить список процессов

Поставь на форму список TListbox и кнопку TButton, по нажатию на кнопке напиши такой код:

procedure TForm1.Button1Click(Sender: TObject);
var
 Wnd: hWnd;
 buff: array[0..127] of Char;
begin
 ListBox1.Clear;
 Wnd := GetWindow(Handle, gw_HWndFirst);
 while Wnd <> 0 do begin {Не показываем:}
   if (Wnd <> Application.Handle) and {-Собственное окно}
     IsWindowVisible(Wnd) and {-Невидимые окна}
     (GetWindow(Wnd, gw_Owner) = 0) and {-Дочернии окна}
     (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}
     then begin
     GetWindowText(Wnd, buff, sizeof(buff));
     ListBox1.Items.Add(StrPas(buff));
   end;
   Wnd := GetWindow(Wnd, gw_hWndNext);
 end;
 ListBox1.ItemIndex := 0;
end;


 
Digitman ©   (2005-08-11 10:22) [3]


> Kazakh   (11.08.05 10:19) [2]


и где в твоем коде хоть какое-либо упоминание о процессах ?


 
begin...end ©   (2005-08-11 10:24) [4]

> Kazakh   (11.08.05 10:19) [2]

Это способ получения списка окон, а не процессов. Причём не самый лучший, поскольку цикл может зависнуть.


 
Grief ©   (2005-08-11 10:46) [5]

А универсального и под нт и под 9х нет?


 
Digitman ©   (2005-08-11 10:51) [6]


> Grief ©   (11.08.05 10:46) [5]


tlhelp32-ф-ции в принципе допустимо вызывать и под НТ, но не рекомендовано самими разработчиками ОС, к тому же они перечислят не все процессы

а зачем тут "универсальность" ?

достаточно при старте приложения определить, на какой платформе оно выполняется, и далее пустить енумерацию процессов по соотв.ветке алгоритма


 
Kazakh   (2005-08-11 10:53) [7]

Вроде этот код отоброжал список всех запущенных процессов.
Типа ctrl+alt+del ---->процессы


 
Kazakh   (2005-08-11 10:57) [8]

Удалено модератором


 
Digitman ©   (2005-08-11 11:07) [9]


> Kazakh   (11.08.05 10:53) [7]
> Вроде этот код отоброжал список всех запущенных процессов


ничего подобного


> RegisterServiceProcess


а это здесь причем ?
какое отношение имеет к получению списка процессов ?


 
Tesla   (2005-08-11 11:27) [10]


> begin...end ©   (11.08.05 10:24) [4]

> поскольку цикл может зависнуть

Можешь объяснить невеже почему цикл может зависнуть?


 
Ботвин Дмитрий   (2005-08-11 11:31) [11]

Kazakh   (11.08.05 10:57) [8]

А что разве RegisterServiceProcess работает в WinXP? У меня
точно такой вариант не прокатил :-)))


 
Игорь Шевченко ©   (2005-08-11 11:49) [12]


> Как получить список всех процессов - раз, как узнать расход
> процессора и памяти на них два.


Запустить Task Manager и не париться


 
Kazakh   (2005-08-11 12:16) [13]

Удалено модератором
Примечание: Offtopic


 
GuAV ©   (2005-08-11 15:45) [14]


>> begin...end ©   (11.08.05 10:24) [4]
>
>> поскольку цикл может зависнуть
>
> Можешь объяснить невеже почему цикл может зависнуть?


Потому что фича у GetWindow такая :) см. Remarks в справке по EnumWindows.


 
Tesla   (2005-08-11 16:09) [15]


> GuAV ©   (11.08.05 15:45) [14]
>
> Потому что фича у GetWindow такая :) см. Remarks в справке
> по EnumWindows.

Сенкс. Просветился.


 
Grief ©   (2005-08-11 16:26) [16]

А код не дадите тогда для 9x?


 
begin...end ©   (2005-08-11 16:57) [17]

> Grief ©   (11.08.05 16:26) [16]

Писал прямо здесь, так что могут быть ошибки, но смысл такой:

uses TlHelp32;
var
 Snapshot: Cardinal;
 Process: TProcessEntry32;
begin
 Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 Win32Check(Snapshot <> INVALID_HANDLE_VALUE);
 try
   Process.dwSize := sizeof(Process);
   if Process32First(Snapshot, Process) then
     repeat
       Memo.Lines.Add(Format("Id: %d, ExeFile: %s", [Process.th32ProcessID, Process.szExeFile]))
     until not Process32Next(Snapshot, Process)
 finally
   CloseHandle(Snapshot)
 end
end.


 
Leonid Troyanovsky ©   (2005-08-11 19:48) [18]


> begin...end ©   (11.08.05 16:57) [17]

> Писал прямо здесь, так что могут быть ошибки, но смысл такой:

>  Win32Check(Snapshot <> INVALID_HANDLE_VALUE);
>  try
..
>    if Process32First(Snapshot, Process) then
>      repeat
..
>        Memo.Lines.Add(Format("Id: %d, ExeFile: %s",
>      until not Process32Next(Snapshot, Process)
>  finally
>    CloseHandle(Snapshot)



Понимаю, что писАл здесь.
Понимаю, что бывают ошибки.
Но, если ты уж пользуешь Win32Check with try-finally,
то надо пользовать до конца, либо вовсе не пользовать и
отсылать обучаемого к домашнему заданию - работе над ошибками.

Иначе, какой смысл в try-finally? В переполнение мемо именами процессов?
Хотя, конечно, может быть и такое ;)

--
Regards, LVT.


 
begin...end ©   (2005-08-11 20:03) [19]

> Leonid Troyanovsky ©   (11.08.05 19:48) [18]

А какой смысл здесь заносить Win32Check в try..finally? Обеспечить закрытие "инвалидного" хэндла? По-моему, вполне логично -- если хэндл нормальный, то он должен быть закрыт.


 
Leonid Troyanovsky ©   (2005-08-11 20:16) [20]


> begin...end ©   (11.08.05 20:03) [19]

> А какой смысл здесь заносить Win32Check в try..finally?
>


Я не предлагал заносить.
Просто, это смешение стилей. Подумай.

--
Regards, LVT.


 
begin...end ©   (2005-08-11 20:25) [21]

> Leonid Troyanovsky ©   (11.08.05 20:16) [20]

Смотрел в код. Долго думал (с) :-)

Что плохого в этом смешении стилей? Честно, не понимаю. Давить исключения я не хочу. Наоборот, я его генерирую, если снимок сделать не удалось. Можно было и не генерировать, а просто тихо выйти (сделать обычное ветвление с if). Далее, если снимок нормальный, то я работаю с ним и обеспечиваю освобождение ресурсов (тут у меня try..finally уже на автомате пишется). Точно так же не задавливая исключения.

Как бы Вы сделали? Правда, интересно :-)


 
Leonid Troyanovsky ©   (2005-08-11 20:48) [22]


> in...end ©   (11.08.05 20:25) [21]

> Смотрел в код. Долго думал (с) :-)

> Что плохого в этом смешении стилей? Честно, не понимаю.
> Давить исключения я не хочу. Наоборот, я его генерирую,
> если снимок сделать не удалось. Можно было и не генерировать,
> а просто тихо выйти (сделать обычное ветвление с if). Далее,
> если снимок нормальный, то я работаю с ним и обеспечиваю
> освобождение ресурсов (тут у меня try..finally уже на автомате
> пишется). Точно так же не задавливая исключения.
>
> Как бы Вы сделали? Правда, интересно :-)


Просто тихо вышел бы без последующего try-except :)
Но, это - на совести обучаемых, о чем и следует их предупредить.
Иначе, они могут впоследствии доверяться магии try-except
при вызове API без Win32Check.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-08-11 20:59) [23]


> Leonid Troyanovsky ©   (11.08.05 20:48) [22]

> Иначе, они могут впоследствии доверяться магии try-except


Млин, try-finally. Sorry.

--
Regards, LVT.


 
GuAV ©   (2005-08-12 02:12) [24]


> Иначе, какой смысл в try-finally? В переполнение мемо
>именами процессов?
> Хотя, конечно, может быть и такое ;)


Imho, любое обращение к VCL (Memo.Lines.Add) или к библиотекам (Format) следует подозревать на возможность поднять исключение. насчёт "магии try-except" это не тот пример, здесь в любом случае нужен if, а если нужна проверка, она делается так:

try
  Process.dwSize := sizeof(Process);
  if Process32First(Snapshot, Process) then
    repeat
      Memo.Lines.Add(Format("Id: %d, ExeFile: %s", [Process.th32ProcessID, Process.szExeFile]))
    until not Process32Next(Snapshot, Process)
  if GetLastError <> ERROR_NO_MORE_FILES then
    RaiseLastOSError;

finally
  CloseHandle(Snapshot)
end


 
begin...end ©   (2005-08-12 07:49) [25]

> GuAV ©   (12.08.05 02:12) [24]

> Imho, любое обращение к VCL (Memo.Lines.Add) или к библиотекам (Format) следует подозревать на возможность поднять исключение.

Здесь согласен.

> здесь в любом случае нужен if

Так почему "в любом случае"-то? Почему я не могу сразу выйти, "громко хлопнув дверью", если мне не удалось получить снимок? Почему обязательно тихо?



Страницы: 1 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.039 c
3-1124779315
ru_efim
2005-08-23 10:41
2005.10.09
Помогите разобраться с методом BookmarkValid у TADOQuery


14-1127143768
ArtemESC
2005-09-19 19:29
2005.10.09
Машина Тьюринга


3-1124636444
fedor
2005-08-21 19:00
2005.10.09
IBDataset и аггрегатные функции


1-1127242434
Pasha L
2005-09-20 22:53
2005.10.09
компилятор Дельфи


14-1127173550
mm0
2005-09-20 03:45
2005.10.09
как зделать post запрос без curl