Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Как правильно написать рабочее тело в сервисе   Найти похожие ветки 

 
Still Swamp   (2005-07-05 15:53) [0]

Как правильно написать рабочее тело в сервисе? Раньше я тред для этого использовал. В нем вроде все понятно.

Сейчас написал:

procedure TMyService.ServiceExecute(Sender: TService);
begin
while not Terminated do begin
 LogDeb("Beep");
 Sleep(integer(1000));
end;
end;

Однако, теперь никак не могу я этот сервис остановить. У меня даже не доходит до вызова OnStop...


 
Digitman ©   (2005-07-05 16:03) [1]


> В нем вроде все понятно


значит, должно быть и понятно, что флаг Terminated сам по себе не взведется - кто-то должен вызвать метод Terminate, чтобы флаг был взведен, в результате чего проверяемое тобой условие выхода из цикла стало истинным

в случае с TServiceThread его метод Terminate вызывается в контексте обработки стоп-контроллера, посылаемого из SCM сервису

выборка/диспетчеризация/обработка SCM-контроллеров инкапсулирована в методе TServiceThread.ProcessRequest()

с учетом этого цикл может выглядеть примерно так :

procedure TMyService.ServiceExecute(Sender: TService);
begin
while not Terminated do begin
LogDeb("Beep");
Sleep(integer(1000));
ServiceThread.ProcessRequest(False);
end;


 
Still Swamp   (2005-07-05 16:05) [2]

Я это понимаю, а кто это флаг должен взвести??? Если у меня есть мой тред, то флаг взводится в процедуре ОnStop для моего треда. А в случае если я использую OnExecute - кто его установит?

Вот что мне не понятно.


 
Still Swamp   (2005-07-05 16:10) [3]

Все разобрался...
Сенкс.


 
Digitman ©   (2005-07-05 16:14) [4]

function TService.DoStop: Boolean;
begin
 Result := True;
 Status := csStopPending;
 if Assigned(FOnStop) then FOnStop(Self, Result);
 if Result then ServiceThread.Terminate;
end;

procedure TServiceThread.ProcessRequests(WaitForMessage: ..);
..
begin
..
         case msg.wParam of
           SERVICE_CONTROL_STOP: ActionOK := FService.DoStop;
..

function TService.DoStop: Boolean;
begin
 Result := True;
 Status := csStopPending;
 if Assigned(FOnStop) then FOnStop(Self, Result);
 if Result then ServiceThread.Terminate;
end;

иными словами, если ты не обрабатываешь событие OnStop (или обрабатываешь и возвращаешь оттуда Stopped := True), флаг Terminated будет взведен в указанном (см. цитату из исх.текста выше) месте



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.039 c
1-1120884727
Dr. Genius
2005-07-09 08:52
2005.07.25
Определение всех версий Windows


14-1119806609
Гарри Поттер
2005-06-26 21:23
2005.07.25
Надо ли вводить сухой закон?


6-1113796630
Cherepovets
2005-04-18 07:57
2005.07.25
VPN


4-1117541590
chili
2005-05-31 16:13
2005.07.25
Подскажите как сделать что бы мой процесс нельзя было завершить


4-1117424627
LEXX_55
2005-05-30 07:43
2005.07.25
Как удалить файл зная только его расширение