Форум: "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