Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прощу помощи разобраться со службой. [D7, XP, 2003]


Страницы:   1 2 3

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]
Подумай, что будет, если более поздний вспомогательный поток отработает раньше более раннего и приемлемо ли такое поведение.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо