![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прощу помощи разобраться со службой. [D7, XP, 2003]
Lamer6666 © (2012-06-17 09:23:00)Доброго времени суток уважаемы.
Начал осваивать службы на основе VCL (WinAPI пока сложновато.)
Прочитал статью на королевстве о создании служб (события, методы) но в целом представление не сложилось.
1. Создал ServiceAplication
2. Скомпилировал
3. service1.exe /install служба появилась в остановленном виде.
Далее как я понимаю необходимо использовать OnStart. Согласно статье тут нужно запускать потоки.
Можно нечто блок схемы функционирования сервиса и поток в нем привести?
Например я понимаю так, исходя из моей задачи:
С разделе OnStart запускаю таймер (пока не представляю как), и по таймеру выполняю например чтение строки из файла 1.txt и запись ее в 2.txt. Так мой сервис работает целый день. Что указать по событию onStop?
Прошу прощение за мое не понимание, и возможно не правильную формулировку, прошу помощи!
Сергей М. (2012-06-20 21:20:00) [1]
> Dennis I. Komarov © (20.06.12 15:53) [50]
По мне так большей "бякой" будет плодить доп.потоки "без особой нужности", с учетом того факта что система автоматически снабжает каждый стартующий сервис минимум одним доп.потоком, который совершенно бестолку простаивает в ожидании крайне редко адресуемых ему системой команд.
Давайте будем жрать! (2012-06-20 16:28:00) [2]
> юзер сперепугу-сбодуна или по незнанию отключит опцию взаимодействия
> твоего сервиса с рабочим столом
Так в висте и выше эта фигня отключена вообще.
Lamer6666 (2012-06-20 16:26:00) [3]
> Ну вот же например пример сервиса именно на дельфи, где
> раз в заданное количество секунд тупо запускается нужный
> код.
> http://www.tolderlund.eu/delphi/service/service.htm
>
> Задержка на одну секунду тупо на Sleep. Достаточно подкрутить
> там интервал.
Урааа наконец то хоть что то.....
Огромное спасибо!!!
Dennis I. Komarov (2012-06-20 15:53:00) [4]
> KSergey © (20.06.12 15:18) [49]
Вешать логику в OnExecute без особой нужности - большая бяка.
KSergey (2012-06-20 15:18:00) [5]Ну вот же например пример сервиса именно на дельфи, где раз в заданное количество секунд тупо запускается нужный код.
http://www.tolderlund.eu/delphi/service/service.htm
Задержка на одну секунду тупо на Sleep. Достаточно подкрутить там интервал.
Сергей М. (2012-06-20 15:08:00) [6]
> Таймер или событие таймера?
Это два неразрывных понятия.
> в чем проблема если он будет работать в основном потоке?
Проблема, если ее и нет сейчас, обязательно будет когда юзер сперепугу-сбодуна или по незнанию отключит опцию взаимодействия твоего сервиса с рабочим столом.
Ограничить его в этом ты заведомо не сможешь, если у того админ.права, - и получишь ты в результате со своим оконным таймером в осн.потоке большущие граблищи.
Dennis I. Komarov (2012-06-20 15:01:00) [7]
> Таймер или событие таймера?
>
> А в чем проблема если он будет работать в основном потоке?
> Простите уж меня непонимающего!!!!
Он не будет там работать, как его не "кидай на форму"... Да забудь ты про таймер.
И основной поток службы для управления ею. Не лезь туда с логикой. Создал там поток, и пусть он делает все что надо...
KSergey (2012-06-20 14:20:00) [8]> Lamer6666 (20.06.12 14:08) [45]
Но вы поищите.
Причем советую не про дельфи искать/читать. Организация работы сервиса - она ж от дельфи не зависит.
Lamer6666 (2012-06-20 14:08:00) [9]
> Всяким говном инет заполнен, а нормальной статьи про то,
> как устроены сервисы в виндах - нету...
И о том же... ((((((((((
KSergey (2012-06-20 14:01:00) [10]Всяким говном инет заполнен, а нормальной статьи про то, как устроены сервисы в виндах - нету...
А ведь когда-то я находил, когда сервис надо было состряпать, причем по-русски.
Lamer6666 (2012-06-20 13:18:00) [11]
> Я такие задачи решаю написание обычной консольной программы
> (можно и не консольной, конечно, а обычной, с GUI, но смысла
> в тут GUI нет никакого). Эта программа делает все полезное
> (прочитать, отправить и т.д.).
> Через sheduler windows (который "назначенные задания" в
> русской виндовс называется) настраиваю запуск этой программы
> с нужной периодичностью. Все, никаких сервисов не нужно.
>
Тоже вариант, но нужна служба. Спасибо за вариант ))
Lamer6666 (2012-06-20 13:06:00) [12]
> А вот если ты создашь (и уничтожишь потом соотв-но) таймер
> в OnExecute, то работать он будет именно в доп.потоке.
Таймер или событие таймера?
А в чем проблема если он будет работать в основном потоке? Простите уж меня непонимающего!!!!
KSergey (2012-06-20 11:06:00) [13]
> Lamer6666 (17.06.12 11:25) [12]
> Ну в целом задача такова:
> Каждые пол минуты необходимо опрашивать БД или файл с данными.
> Если есть новые данные, то отправлять GET запрос на добавление
> этих данных стороннему WEB серверу.
Я такие задачи решаю написание обычной консольной программы (можно и не консольной, конечно, а обычной, с GUI, но смысла в тут GUI нет никакого). Эта программа делает все полезное (прочитать, отправить и т.д.).
Через sheduler windows (который "назначенные задания" в русской виндовс называется) настраиваю запуск этой программы с нужной периодичностью. Все, никаких сервисов не нужно.
Основным плюсы вижу следующее. Стабильность работы такой конструкции получается существенно выше, т.к. даже если программа грохнулась - в следующий раз она все равно запустится и, возможно, даже отработает корректно. Т.е. требования к требуемому качеству существенно ниже, соответственно структура и написание такой программки - несоизмеримо проще.
Время запуска ставим в значение "при включении компьютера" - тогда будет молотить круглосуточно. Правда чаще 1-го раза в минуту запуск настроить нельзя.
Dennis I. Komarov (2012-06-19 16:12:00) [14]
> DVM © (19.06.12 15:53) [39]
Если все будет прибито, кто к объекту обращаться будет для AV?
DVM (2012-06-19 15:53:00) [15]
> Dennis I. Komarov © (19.06.12 14:34) [38]
> Смотря что делает поток...
Судя по его описанию он у него выполняет как минимум HTTP GET запросы и запросы к базе данных. Следовательно, теоретически, может получиться, что выполнение повиснет на Connect (а это в случае блокирующих сокетов секунд 20 минимум), если в этот момент кто-то решит перезапустить или остановить службу, поток не сможет завершиться вовремя, а служба при таком раскладе его ждать не будет, все аварийно будет прибито и выскочит наверняка AV.
Dennis I. Komarov (2012-06-19 14:34:00) [16]
> словишь ты тут проблем
Смотря что делает поток...
А чего ловить-то будет? "Влада"? :)
Dennis I. Komarov (2012-06-19 14:32:00) [17]1. Сперва напиши не службу, а обычное приложение вынеся логику в отдельные потоки.
2. Основной поток службы - не про Вашу честь, и нечего туда пихать свой код.
DVM (2012-06-19 13:22:00) [18]
> NewThread1.FreeOnTerminate:=true;
словишь ты тут проблем
DVM (2012-06-19 13:14:00) [19]
> Lamer6666 (19.06.12 12:26) [33]
> В принципе я так и планирую что таймер в основном потоке
> вертеться будет, опрашивать БД/ФАЙЛ
> Если появились новые записи то что то в роде:
>
> NewThread1:=TThread.Create(true);
> NewThread1.FreeOnTerminate:=true;
> NewThread1.Priority:=tpLowest;
> NewThread1.Resume;
Не проще ли выхинуть нахрен таймер, как чуждый службам элемент, а всю работу выполнять в потоке, тем более, что изменения в файле легко отслеживать с пом ReadDirectoryChangesW + WaitForXXX функций. Поток сам будет просыпаться в нужные моменты и делать необходимую тебе работу.
Для БД в том же потоке можно подписаться на уведомления (если сервер СУБД их поддерживает) или просто периодически опрашивать базу.
CRLF (2012-06-19 12:59:00) [20]
> Lamer6666 (19.06.12 12:26) [33]
Подумай, что будет, если более поздний вспомогательный поток отработает раньше более раннего и приемлемо ли такое поведение.