Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Программа контроля процессов


Автор: ЧеловекБорща 29.8.2011, 22:44
Доброго времени суток!

Хочу написать программу которая будет запускать программы и управлять ими. Вопрос по второй части, управление.

Как "привязать" запущеный exe к себе? т.е. узнавать когда exe зависает, когда он запускается, когда работает.

Сейчас я запускаю TThread, передаю ему структуру информации о программе которую надо запускать. Поток запускает и ждёт завершения. 
В момент запуска потока, становится статус что ПО работает. В момент завершения что "не работает".
Ну собственно все вот-так вот. 

Может можно как-то по другому реализовать? Чтобы было больше информации о работающем процессе.И возможность управления процессом по больше. Интересуют все идеи.

Автор: kami 30.8.2011, 00:19
Цитата(ЧеловекБорща @  29.8.2011,  22:44 Найти цитируемый пост)
Может можно как-то по другому реализовать?

имхо, даже нужно. Куча потоков, единственная задача которых - просигнализировать о завершении процесса не есть гуд.
Чтобы программа была "правильной", используй что-нибудь типа http://msdn.microsoft.com/en-us/library/ms685061(v=vs.85).aspx. Имхо, самый верный вариант, хоть и не самый легкий (и первая трудность - callback-функция будет работать в незнамо каком потоке). Зато можно назначить интервал (сразу отказавшись от таймера) и по нему выводить нужные параметры процесса пользователю "прямо из" callback-а,  в онлайн-режиме.

Цитата(ЧеловекБорща @  29.8.2011,  22:44 Найти цитируемый пост)
Чтобы было больше информации о работающем процессе.

http://msdn.microsoft.com/en-us/library/ms684847(v=vs.85).aspx#process_functions - все, начинающиеся с Get и Query. Выбрать нужные smile

Цитата(ЧеловекБорща @  29.8.2011,  22:44 Найти цитируемый пост)
узнавать когда exe зависает

Определи критерий "зависания". То, что визуальное окно не отвечает, еще не значит, что процесс завис. Может, там просто какая-то длительная операция идет. А может, завис только один из потоков процесса, а остальные ведут себя адекватно. Самый наглядный пример - зависание окна проводника. Можно открыть кучу других его окон, но процесс-то останется один - explorer.exe.

Добавлено через 2 минуты и 2 секунды
Цитата(kami @  30.8.2011,  00:19 Найти цитируемый пост)
все, начинающиеся с Get и Query.

Пардон, не все. Только те, где в описании указано " for the specified process"

Автор: ЧеловекБорща 30.8.2011, 10:10
старая программа работает вот как:
1. запускается поток с уже преданной ему структурой данных.
2. Поток исходя изданных о новом процессе, запускает его и выполняет WaitForSingleObject
Но программу нужно было расширить и добавить функционал остановки/перезапуска/оключениязадчани в указанное время. Что тоже выполняеся по средству WaitForSingleObject 
Ну и тут начались проблемы и не удобства. 

Собираюсь переписать ПО, и кординально все изменить. 
под зависаниями я имел ввиду тот факт, что программа(окног программы не отвечает). Ну это IsHungWindow проверяет.  А с консольками, ну там вообще ужос. 


kami, 
1. т.е. мне просто запускать поток, передавать ему информацию, поток запускает программу через CreateProcess и манипулирует 
RegisterWaitForSingleObject ?

После вызова этой функции, код потока шагает дальше и можно обращаться к возвращаемому callback'у или выполнение кода виснет(как в случае с WaitForSingleObject)?


Автор: kami 30.8.2011, 17:35
Цитата(ЧеловекБорща @  30.8.2011,  10:10 Найти цитируемый пост)
т.е. мне просто запускать поток, передавать ему информацию, поток запускает программу через CreateProcess и манипулирует RegisterWaitForSingleObject ?

Нет. Дополнительный поток вообще не нужен. Его создаст система при необходимости.
Порядок использования примерно следующий (все можно делать из VCL-потока):
1. Запускается нужный exe.
2. Вызывается registerWaitForSingleObject, в которую передается calback-функция, таймаут, нужные флаги и т.п.
3. Когда ожидание становится не нужным - вызывается разрегистрация.

В callback-функции (нужно не забывать, что из нее работать напрямую с vcl-компонентами НЕЛЬЗЯ!):
на основании параметра, переданного в нее, вычисляется, какой процесс вызывал срабатывание.
По вычисленному процессу выполняются определенные действия (в частности - асинхронно передаются в основной поток данные по процессу); вычисляются нужные параметры и т.п.
Выход из функции.

Добавлено через 4 минуты и 59 секунд
Цитата(kami @  30.8.2011,  17:35 Найти цитируемый пост)
2. Вызывается registerWaitForSingleObject, в которую передается calback-функция, таймаут, нужные флаги и т.п.

Если выставить таймаут, к примеру, 1 секунду и не ставить флаг WT_EXECUTEONLYONCE, то можно (как диспетчер задач) отслеживать в реальном времени состояние и параметры процесса.

Цитата(ЧеловекБорща @  30.8.2011,  10:10 Найти цитируемый пост)
После вызова этой функции, код потока шагает дальше и можно обращаться к возвращаемому callback'у или выполнение кода виснет(как в случае с WaitForSingleObject)?

Ничего не виснет. Пункты 1-3 выполняются "влет", не задерживаясь и не вызывая реального ожидания как с WaitFor...
Цитата(ЧеловекБорща @  30.8.2011,  10:10 Найти цитируемый пост)
под зависаниями я имел ввиду тот факт, что программа(окног программы не отвечает). Ну это IsHungWindow проверяет.  А с консольками, ну там вообще ужос. 

Это не полный ответ. Опять-таки - на примере Explorer.exe - куча окон проводника, одно зависло (к примеру - не справилось с отрисовкой эскизов), остальные работают. Процесс на все окна один. Как считать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)