Вниз
Скачать: CL | DM;

OnStop в службе...   Найти похожие ветки 

← →
Makhanev Alexander   (2007-07-13 20:31) [0]

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

Тесты показывают, что когда в момент выполнения рутинной операции сервис стопается (программно, через controlservice), то событие OnStop не наступает. Оно и не наступает потом, после завершения операции.

Есть идеи что может быть не так и как выкрутиться?

А то служба потом только вручную стопается..


← →
Makhanev Alexander   (2007-07-13 20:39) [1]

когда стопаю вручную в момент уртинных операций, то винда пишет что


> Не удалось остановить службу XXX на Локальный компьютер.
> Эта служба не возвращала ошибки. Возможно, это внутренняя ошибка Windows или внутренняя ошибка службы.
> Если проблема не исчезает, обратитесь к системному администратору.
>


При повторной попытке служба стопается. Но событие OnStop всё равно не ловится.

Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно и хочется понять почему всё же нет события.


← →
atruhin ©   (2007-07-13 22:19) [2]

> хочется понять почему всё же нет события.

Потому что некому на него реагировать. Основной поток сервиса не отвечает.

> Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно

Работать с сетью в асинхронном режиме, не будет подвисания.
Хотя чем не целесообразен доп. поток не понятно.


← →
Makhanev Alexander   (2007-07-13 23:19) [3]


> Хотя чем не целесообразен доп. поток не понятно.


я юзаю vcl компонет и если постоянно делать synchronize то в чем смысл потока ? он сможет среагировать на сообщение?


← →
atruhin ©   (2007-07-14 04:39) [4]

> я юзаю vcl компонет

Т.е. сервис взаимодействует с рабочим столом? Тогда плохой стиль.
Остается асинхронная работа с сокетом.


← →
Makhanev Alexander   (2007-07-14 10:15) [5]


> Т.е. сервис взаимодействует с рабочим столом? Тогда плохой
> стиль.
> Остается асинхронная работа с сокетом.


Он не взаимодействует с раб. столом. Он просто юзает невизуальный компонент ftpClient из ICS. Я точно не знаю, относится оно к VCL или нет и соответсвтенно, можно с ним работать в потоке или нет..


← →
Makhanev Alexander   (2007-07-14 10:24) [6]

кстати, а аналога processmessages в сервисах нет?


← →
Сергей М. ©   (2007-07-14 11:58) [7]


> Оно и не наступает потом, после завершения операции


И не наступит. Так задумано - OnStop возникает лишь как ответная реакция сервиса на требование SCM остановиться.

Естественно, если сервис чем-то занят и не может вовремя обработать SCM-команду останова (попросту "проспал" ее появление), событие тоже не возникнет.


> аналога processmessages в сервисах нет?


Есть. ProcessRequests()


← →
Makhanev Alexander   (2007-07-14 19:43) [8]

всё же ProcessRequests не всегда срабатывал и вариант с цикличным выполнением stop (пока не остановится) пока работает стабильно.

хотя msdn вроде пишет, что после посылки стопа ничего не надо слать...

кто знает, какая здесь есть потенциальная опасность?


     ControlService(hService, SERVICE_CONTROL_STOP, State);
     QueryServiceStatus(hService, State);
     j := 0;
     while (j < 20) and (State.dwCurrentState <> SERVICE_STOPPED) do
     begin
       ControlService(hService, SERVICE_CONTROL_STOP, State);
       Sleep(1000);
       QueryServiceStatus(hService, State);
       Inc(j);
     end;


← →
Сергей М. ©   (2007-07-16 08:19) [9]

К чему этот код ?

Код метода Execute приводи.



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.022 c
15-1187788580
TUser
2007-08-22 17:16
2007.09.23
Китайцев хачу


15-1187876173
iXT
2007-08-23 17:36
2007.09.23
Почему нельзя сменить ник(login) в анкете?


15-1188044874
Бася
2007-08-25 16:27
2007.09.23
Эксперт для Делфи


2-1188472359
kudatsky
2007-08-30 15:12
2007.09.23
Можно-ли ввести данные в TStringGrid в Design Time ?


2-1187935208
Женя_кэт
2007-08-24 10:00
2007.09.23
Сохранение рисунков в MSSQL




   Наверх