Текущий архив: 2003.02.17;
Скачать: CL | DM;
ВнизService + приложение Найти похожие ветки
← →
ewgeny (2002-12-15 10:38) [0]Есть надобность написать сервис, который будет поднимать определенный процесс.
То есть,например, у меня есть приложение, которое что-то должно постоянно делать. При перезагрузке,соотвественно, это приложение не сможет само по себе подняться(без логина). Поэтому пришла идея написать службу, которая будет это делать.
Какой лучше способ использовать для проверки того, загружен ли данный процесс в память или нет (в данном случае мое приложение)?
Приходит в голову тупой способ проверки по какому-нибудь mutex и
если данного объекта нет в памяти, то запускать новый процесс(мое приложение).
Может кто занимался данной проблемой ? И нужно ли в моейм случае использовать WaitForSingleObject ?
← →
AngeL B. (2002-12-15 10:49) [1]Поясни более подробно что тебе надо.
То ли тебе надо, чтобы прилага стартовала всегда при запуске системы, но тогда есть уже готовое решение (anysrv.exe из Resource Kit).
То ли тебе надо чтобы программа запускалась по событию, но тогда непонятно, кто его будет устанавливать.
ЗЫ: Кстати Mutex ни в одном случае совершенно ни при чем.
← →
ewgeny (2002-12-15 10:54) [2]написанный сервис должен при старте системы запускать другое приложение. Если данное приложение убить(например пользователь нажал крестик), то сервис глядя, что процесс убит, должен опять поднять его. Вот и всё.
← →
Reindeer Moss Eater (2002-12-15 10:56) [3]А может пусть сам сервис делает то, что должно делать приложение?
← →
ewgeny (2002-12-15 11:03) [4]нет, именно нужно то, что описано в вопросе ;(
← →
AngeL B. (2002-12-15 11:22) [5]Ну и проверяй каждые пол-сек. наличие прилаги.
Только сервис надо запускать с правом интерактивного общения
← →
ewgeny (2002-12-15 13:43) [6]Накидал вот тут примерчик, суть которого сводится к тому, что если процесса нет в памяти, то он создается.
НО: ЗАГРУЗКА ПРОЦЕССОРА ПО 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;
← →
Reindeer Moss Eater (2002-12-15 13:48) [7]Сначала
ServiceThread.ProcessRequests(False);
заменить на
ServiceThread.ProcessRequests(True);
Потом добавить Sleep внутри цикла
← →
ewgeny (2002-12-15 14:26) [8]поменял и вставил Sleep. При старте сервиса запускается процесс, а вот если этот процесс убить, то новый процесс не открывается ;(
← →
Reindeer Moss Eater (2002-12-15 14:46) [9]"Не открывается", или не происходит вызова CreateProcess?
← →
ewgeny (2002-12-15 14:51) [10]Именно не происходит вызова createprocess и такое ощущение, что ProcessRequest(True) ждет чего-то ;)
← →
Reindeer Moss Eater (2002-12-15 15:01) [11]Ну так это же твой алгоритм, пересмотри условия вызова, проверь флаги на основании которых что-то делается.
И вообще добавь в приложение ведение отладочного журнала. Что бы не гадать на кофейной гуще
← →
ewgeny (2002-12-15 15:15) [12]надо было все оставить как есть, и СЛИП побольше сделать
← →
AngeL B. (2002-12-15 15:41) [13]надо было поставить WaitForSingleObject вместо Sleep. Если дождался, процесс прибили, если нет, то просто время истекло.
Страницы: 1 вся ветка
Текущий архив: 2003.02.17;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c