Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизКак правильно написать рабочее тело в сервисе Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c