![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процессы [D7, WinXP]
Grief © (2005-08-10 22:56:00)Как получить список всех процессов - раз, как узнать расход процессора и памяти на них два. Плюс если еще чтото по процессу можно узнать - тоже можете сказать. Спасибо.
begin...end (2005-08-12 07:49:00) [1]> GuAV © (12.08.05 02:12) [24]
> Imho, любое обращение к VCL (Memo.Lines.Add) или к библиотекам (Format) следует подозревать на возможность поднять исключение.
Здесь согласен.
> здесь в любом случае нужен if
Так почему "в любом случае"-то? Почему я не могу сразу выйти, "громко хлопнув дверью", если мне не удалось получить снимок? Почему обязательно тихо?
GuAV (2005-08-12 02:12:00) [2]
> Иначе, какой смысл в 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
Leonid Troyanovsky (2005-08-11 20:59:00) [3]
> Leonid Troyanovsky © (11.08.05 20:48) [22]
> Иначе, они могут впоследствии доверяться магии try-except
Млин, try-finally. Sorry.
--
Regards, LVT.
Leonid Troyanovsky (2005-08-11 20:48:00) [4]
> in...end © (11.08.05 20:25) [21]
> Смотрел в код. Долго думал (с) :-)
> Что плохого в этом смешении стилей? Честно, не понимаю.
> Давить исключения я не хочу. Наоборот, я его генерирую,
> если снимок сделать не удалось. Можно было и не генерировать,
> а просто тихо выйти (сделать обычное ветвление с if). Далее,
> если снимок нормальный, то я работаю с ним и обеспечиваю
> освобождение ресурсов (тут у меня try..finally уже на автомате
> пишется). Точно так же не задавливая исключения.
>
> Как бы Вы сделали? Правда, интересно :-)
Просто тихо вышел бы без последующего try-except :)
Но, это - на совести обучаемых, о чем и следует их предупредить.
Иначе, они могут впоследствии доверяться магии try-except
при вызове API без Win32Check.
--
Regards, LVT.
begin...end (2005-08-11 20:25:00) [5]> Leonid Troyanovsky © (11.08.05 20:16) [20]
Смотрел в код. Долго думал (с) :-)
Что плохого в этом смешении стилей? Честно, не понимаю. Давить исключения я не хочу. Наоборот, я его генерирую, если снимок сделать не удалось. Можно было и не генерировать, а просто тихо выйти (сделать обычное ветвление с if). Далее, если снимок нормальный, то я работаю с ним и обеспечиваю освобождение ресурсов (тут у меня try..finally уже на автомате пишется). Точно так же не задавливая исключения.
Как бы Вы сделали? Правда, интересно :-)
Leonid Troyanovsky (2005-08-11 20:16:00) [6]
> begin...end © (11.08.05 20:03) [19]
> А какой смысл здесь заносить Win32Check в try..finally?
>
Я не предлагал заносить.
Просто, это смешение стилей. Подумай.
--
Regards, LVT.
begin...end (2005-08-11 20:03:00) [7]> Leonid Troyanovsky © (11.08.05 19:48) [18]
А какой смысл здесь заносить Win32Check в try..finally? Обеспечить закрытие "инвалидного" хэндла? По-моему, вполне логично -- если хэндл нормальный, то он должен быть закрыт.
Leonid Troyanovsky (2005-08-11 19:48:00) [8]
> 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 16:57:00) [9]> 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.
Grief (2005-08-11 16:26:00) [10]А код не дадите тогда для 9x?
Tesla (2005-08-11 16:09:00) [11]
> GuAV © (11.08.05 15:45) [14]
>
> Потому что фича у GetWindow такая :) см. Remarks в справке
> по EnumWindows.
Сенкс. Просветился.
GuAV (2005-08-11 15:45:00) [12]
>> begin...end © (11.08.05 10:24) [4]
>
>> поскольку цикл может зависнуть
>
> Можешь объяснить невеже почему цикл может зависнуть?
Потому что фича у GetWindow такая :) см. Remarks в справке по EnumWindows.
Kazakh (2005-08-11 12:16:00) [13]Удалено модератором
Примечание: Offtopic
Игорь Шевченко (2005-08-11 11:49:00) [14]
> Как получить список всех процессов - раз, как узнать расход
> процессора и памяти на них два.
Запустить Task Manager и не париться
Ботвин Дмитрий (2005-08-11 11:31:00) [15]Kazakh (11.08.05 10:57) [8]
А что разве RegisterServiceProcess работает в WinXP? У меня
точно такой вариант не прокатил :-)))
Tesla (2005-08-11 11:27:00) [16]
> begin...end © (11.08.05 10:24) [4]
> поскольку цикл может зависнуть
Можешь объяснить невеже почему цикл может зависнуть?
Digitman (2005-08-11 11:07:00) [17]
> Kazakh (11.08.05 10:53) [7]
> Вроде этот код отоброжал список всех запущенных процессов
ничего подобного
> RegisterServiceProcess
а это здесь причем ?
какое отношение имеет к получению списка процессов ?
Kazakh (2005-08-11 10:57:00) [18]Удалено модератором
Kazakh (2005-08-11 10:53:00) [19]Вроде этот код отоброжал список всех запущенных процессов.
Типа ctrl+alt+del ---->процессы
Digitman (2005-08-11 10:51:00) [20]
> Grief © (11.08.05 10:46) [5]
tlhelp32-ф-ции в принципе допустимо вызывать и под НТ, но не рекомендовано самими разработчиками ОС, к тому же они перечислят не все процессы
а зачем тут "универсальность" ?
достаточно при старте приложения определить, на какой платформе оно выполняется, и далее пустить енумерацию процессов по соотв.ветке алгоритма