Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа контроля процессов, менеджер задач 
:(
    Опции темы
ЧеловекБорща
  Дата 29.8.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 5.6.2010

Репутация: нет
Всего: нет



Доброго времени суток!

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

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

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

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

PM MAIL   Вверх
kami
Дата 30.8.2011, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



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

имхо, даже нужно. Куча потоков, единственная задача которых - просигнализировать о завершении процесса не есть гуд.
Чтобы программа была "правильной", используй что-нибудь типа RegisterWaitForSingleObject Function. Имхо, самый верный вариант, хоть и не самый легкий (и первая трудность - callback-функция будет работать в незнамо каком потоке). Зато можно назначить интервал (сразу отказавшись от таймера) и по нему выводить нужные параметры процесса пользователю "прямо из" callback-а,  в онлайн-режиме.

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

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"
PM MAIL WWW   Вверх
ЧеловекБорща
Дата 30.8.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 5.6.2010

Репутация: нет
Всего: нет



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

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


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

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


PM MAIL   Вверх
kami
Дата 30.8.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ЧеловекБорща @  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 - куча окон проводника, одно зависло (к примеру - не справилось с отрисовкой эскизов), остальные работают. Процесс на все окна один. Как считать?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.