Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-1120828756
onics
2005-07-08 17:19
2005.07.25
Параметры ф-ции Excel.ActiveWorkbook.SaveAs


10-1097854855
ALex17
2004-10-15 19:40
2005.07.25
поиск


10-1097643914
Rem
2004-10-13 09:05
2005.07.25
Интерфейсы


10-1097076855
vixic
2004-10-06 19:34
2005.07.25
COM и события


3-1118498889
Koala
2005-06-11 18:08
2005.07.25
Помогите с запросом... FB 1.5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский