Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.105 c
4-1124021579
webpauk
2005-08-14 16:12
2005.10.09
Сообщение при прерывании процесса


3-1125304654
Alex Kryuchkov
2005-08-29 12:37
2005.10.09
BLOB-поля в SYBASE


9-1117168849
Slavikk
2005-05-27 08:40
2005.10.09
GLScene - классы


14-1126752415
vrem
2005-09-15 06:46
2005.10.09
Как на вас влияет пятно на солнце? :)


14-1126858405
Juice
2005-09-16 12:13
2005.10.09
Опять проблемы с ноутбуком





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский