![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| ЧеловекБорща |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 5.6.2010 Репутация: нет Всего: нет |
Доброго времени суток!
Хочу написать программу которая будет запускать программы и управлять ими. Вопрос по второй части, управление. Как "привязать" запущеный exe к себе? т.е. узнавать когда exe зависает, когда он запускается, когда работает. Сейчас я запускаю TThread, передаю ему структуру информации о программе которую надо запускать. Поток запускает и ждёт завершения. В момент запуска потока, становится статус что ПО работает. В момент завершения что "не работает". Ну собственно все вот-так вот. Может можно как-то по другому реализовать? Чтобы было больше информации о работающем процессе.И возможность управления процессом по больше. Интересуют все идеи. |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
имхо, даже нужно. Куча потоков, единственная задача которых - просигнализировать о завершении процесса не есть гуд. Чтобы программа была "правильной", используй что-нибудь типа RegisterWaitForSingleObject Function. Имхо, самый верный вариант, хоть и не самый легкий (и первая трудность - callback-функция будет работать в незнамо каком потоке). Зато можно назначить интервал (сразу отказавшись от таймера) и по нему выводить нужные параметры процесса пользователю "прямо из" callback-а, в онлайн-режиме. process functions - все, начинающиеся с Get и Query. Выбрать нужные Определи критерий "зависания". То, что визуальное окно не отвечает, еще не значит, что процесс завис. Может, там просто какая-то длительная операция идет. А может, завис только один из потоков процесса, а остальные ведут себя адекватно. Самый наглядный пример - зависание окна проводника. Можно открыть кучу других его окон, но процесс-то останется один - explorer.exe. Добавлено через 2 минуты и 2 секунды Пардон, не все. Только те, где в описании указано " for the specified process" |
|||
|
||||
| ЧеловекБорща |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 5.6.2010 Репутация: нет Всего: нет |
старая программа работает вот как:
1. запускается поток с уже преданной ему структурой данных. 2. Поток исходя изданных о новом процессе, запускает его и выполняет WaitForSingleObject Но программу нужно было расширить и добавить функционал остановки/перезапуска/оключениязадчани в указанное время. Что тоже выполняеся по средству WaitForSingleObject Ну и тут начались проблемы и не удобства. Собираюсь переписать ПО, и кординально все изменить. под зависаниями я имел ввиду тот факт, что программа(окног программы не отвечает). Ну это IsHungWindow проверяет. А с консольками, ну там вообще ужос. kami, 1. т.е. мне просто запускать поток, передавать ему информацию, поток запускает программу через CreateProcess и манипулирует RegisterWaitForSingleObject ? После вызова этой функции, код потока шагает дальше и можно обращаться к возвращаемому callback'у или выполнение кода виснет(как в случае с WaitForSingleObject)? |
|||
|
||||
| kami |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Нет. Дополнительный поток вообще не нужен. Его создаст система при необходимости. Порядок использования примерно следующий (все можно делать из VCL-потока): 1. Запускается нужный exe. 2. Вызывается registerWaitForSingleObject, в которую передается calback-функция, таймаут, нужные флаги и т.п. 3. Когда ожидание становится не нужным - вызывается разрегистрация. В callback-функции (нужно не забывать, что из нее работать напрямую с vcl-компонентами НЕЛЬЗЯ!): на основании параметра, переданного в нее, вычисляется, какой процесс вызывал срабатывание. По вычисленному процессу выполняются определенные действия (в частности - асинхронно передаются в основной поток данные по процессу); вычисляются нужные параметры и т.п. Выход из функции. Добавлено через 4 минуты и 59 секунд
Если выставить таймаут, к примеру, 1 секунду и не ставить флаг WT_EXECUTEONLYONCE, то можно (как диспетчер задач) отслеживать в реальном времени состояние и параметры процесса. Ничего не виснет. Пункты 1-3 выполняются "влет", не задерживаясь и не вызывая реального ожидания как с WaitFor...
Это не полный ответ. Опять-таки - на примере Explorer.exe - куча окон проводника, одно зависло (к примеру - не справилось с отрисовкой эскизов), остальные работают. Процесс на все окна один. Как считать? |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |