Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Service + приложение [D5, NT4, Win2k]


ewgeny ©   (2002-12-15 10:38:00) 

Есть надобность написать сервис, который будет поднимать определенный процесс.
То есть,например, у меня есть приложение, которое что-то должно постоянно делать. При перезагрузке,соотвественно, это приложение не сможет само по себе подняться(без логина). Поэтому пришла идея написать службу, которая будет это делать.

Какой лучше способ использовать для проверки того, загружен ли данный процесс в память или нет (в данном случае мое приложение)?
Приходит в голову тупой способ проверки по какому-нибудь mutex и
если данного объекта нет в памяти, то запускать новый процесс(мое приложение).

Может кто занимался данной проблемой ? И нужно ли в моейм случае использовать WaitForSingleObject ?


AngeL B.   (2002-12-15 15:41:00) [1]

надо было поставить WaitForSingleObject вместо Sleep. Если дождался, процесс прибили, если нет, то просто время истекло.


ewgeny   (2002-12-15 15:15:00) [2]

надо было все оставить как есть, и СЛИП побольше сделать


Reindeer Moss Eater   (2002-12-15 15:01:00) [3]

Ну так это же твой алгоритм, пересмотри условия вызова, проверь флаги на основании которых что-то делается.
И вообще добавь в приложение ведение отладочного журнала. Что бы не гадать на кофейной гуще


ewgeny   (2002-12-15 14:51:00) [4]

Именно не происходит вызова createprocess и такое ощущение, что ProcessRequest(True) ждет чего-то ;)


Reindeer Moss Eater   (2002-12-15 14:46:00) [5]

"Не открывается", или не происходит вызова CreateProcess?


ewgeny   (2002-12-15 14:26:00) [6]

поменял и вставил Sleep. При старте сервиса запускается процесс, а вот если этот процесс убить, то новый процесс не открывается ;(


Reindeer Moss Eater   (2002-12-15 13:48:00) [7]

Сначала
ServiceThread.ProcessRequests(False);
заменить на
ServiceThread.ProcessRequests(True);

Потом добавить Sleep внутри цикла


ewgeny   (2002-12-15 13:43:00) [8]

Накидал вот тут примерчик, суть которого сводится к тому, что если процесса нет в памяти, то он создается.

НО: ЗАГРУЗКА ПРОЦЕССОРА ПО TASK MANAGER"У 100%. Как избежать этого ?

структуры si и pi передаются нулевыми.

while not Terminated do
begin
If Flag or ( myExitCode <> STILL_ACTIVE ) Then
If CreateProcess( nil,
PChar("c:\telnet\telnet.exe"),
nil,
nil,
false,
normal_priority_class,
nil,
nil,
si,
pi ) Then
begin
Flag := False;
ProcessId := pi.dwProcessId;
hProcess := pi.hProcess;
end;
GetExitCodeProcess( hProcess, myExitCode);
ServiceThread.ProcessRequests(False);
end;


AngeL B.   (2002-12-15 11:22:00) [9]

Ну и проверяй каждые пол-сек. наличие прилаги.
Только сервис надо запускать с правом интерактивного общения


ewgeny   (2002-12-15 11:03:00) [10]

нет, именно нужно то, что описано в вопросе ;(


Reindeer Moss Eater   (2002-12-15 10:56:00) [11]

А может пусть сам сервис делает то, что должно делать приложение?


ewgeny   (2002-12-15 10:54:00) [12]

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


AngeL B.   (2002-12-15 10:49:00) [13]

Поясни более подробно что тебе надо.
То ли тебе надо, чтобы прилага стартовала всегда при запуске системы, но тогда есть уже готовое решение (anysrv.exe из Resource Kit).
То ли тебе надо чтобы программа запускалась по событию, но тогда непонятно, кто его будет устанавливать.

ЗЫ: Кстати Mutex ни в одном случае совершенно ни при чем.


Наверх

Титульная страница Поиск, карта сайта Написать письмо