![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Доброго времени суток!
Задачка: Создать приложение-сервис. Что делает приложение? У приложения есть таймер. Таймер по умолчанию включен, разве что интервал работы таймера, вводит пользователь через файл ini. Когда таймер отстучал свой интервал, запускается поток TThread. Проблема в том, что я немогу толково написать этот TService ![]() Ну просто не запускает поток.. ну почему?? Заодно, можно указать мне на ошибки, которые я допустил? Вот код: Код:
Очень прошу помощи у тех, кто разбирается, и уже писал подобного рода приложения. Последний раз редактировалось Человек_Борща; 04.07.2011 в 03:13. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
1) неплохо бы выводить в лог состояние сервиса - запущен, остановлен, и т.д., а то может дело до таймера вобще не доходит.
2) TimerInterval вывести в лог, может там на несколько часов интервальчик 3) в лог выводим, что RunThread() отработал, возможно, до него дело и не доходит. 4) если RunThread() отрабатывает, давайте исходник TWorkThread. 5) и желательно глобальную переменную Thr сделать полем класса TSFU, т.к. один модуль может содержать несколько сервисов.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 04.07.2011 в 13:05. |
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]() Цитата:
TworkThread работает стабильно и 100%. Перед созданием сервиса, я издевался на VCL приложением. С сервисом чуть сложнее. Вообще всё должно быть так: Запускается сервис, запускается таймер. По окончанию интервала запускается поток TThread. Какие события сервиса вообще использовать мне? так же к сервису подключен DataModule. В его OnCreate создаются и загружаются все списки. А так же параметры для работы потока WorkThread. Какое событие генерируется первым? DataModule.OnCreate или TSerrvice.OnCreate? И последнее.. как производить отладку сервиса? |
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Нет. Таймер на 5 секунд.
без лога я бы с такой уверенностью это не утверждал. > Запускается сервис, запускается таймер. кстати, таймер-то работает через виндовые сообщения, а кто их выгребает? Я бы не советовал без крайней необходимости юзать контролы, основанные на сообщениях, в сервисах. В общем случае сервис не должен содержать окон и прочего кода, основанного на рассылке сообщений. Если так уж нужны окна, то лучше, если сервис будет запускать обычное гуевое приложение, которое будет тихонько сидеть в трее и делать что нужно. А если просто нужен таймер, то полно таймеров, не основанных на оконных сообщениях. > как производить отладку сервиса? логи рулят. Для себя я обычно отлаживаю весь код вне сервиса, а потом просто оборачиваю его в сервис. Интерактивно отлаживать сервис в Дельфи нельзя (без танцев с бубном).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#5 | |||
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]() Цитата:
TimerInterval:=1000; А по другому где-те ещё приплюсовать и не может. Но логировать абсолютно все это вариант. Цитата:
Можно показать пример такого таймера? Я использую стандартный TTimer(При servce application он дотупен на вкладке System). Цитата:
Осталось прикрутить поток и таймер к сервису. Но я не знаю как заставить их работать. В сервисе.... Какие Свойства Tservice мне выставлять, и какими событиями пользоваться? Что создаётся первым TService или DataModule? И где наконец можно почитать нормальную документацию о обьекту TService? Читал DRKB, читал справку Delphi 7,2010 и XE. Последний раз редактировалось Человек_Борща; 04.07.2011 в 14:47. |
|||
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> логировать абсолютно все это вариант
всё не всё, но полезно выводить в лог ключевые значения и точки прохождения программы. И не забыть в релизе всё это логирование отключить (через {$IFDEF DEBUG } ). > показать пример такого таймера? Мультимедийный таймер, например. Работает в своём потоке, сообщения не использует. > Что создаётся первым TService или DataModule? ну так это в исходниках проекта надо глянуть. Скорей всего, DataModule. Кстати, кода для создания переменной SFU я вобще не вижу. > И где наконец можно почитать нормальную документацию о обьекту TService? Да это просто обёртка вокруг сервисного API, чё там документировать. Вобще, мне кажется проще руками сервис поднимать, без Дельфовых обёрток. Больше контроля. Хотя, для простенького сервиса, вероятно, путь через File -> New -> Service Application будет достаточен.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
окей.. потоптал форум. Нашёл полезное сообщение.
последовал вашему совету, логировать абсолютно все. Создал тестовое Service Application с DataModule. Project1.dpr Код:
Код:
Код:
В лог заностися только создание/уничтожение DataModule. Почему? Что я не так делаю? голый сервис ведь.. Последний раз редактировалось Человек_Борща; 04.07.2011 в 15:44. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Почему? Что я не так делаю?
дык сервис надо сначала установить в систему, и запускать уже через SCM. Это ж не обычное приложение. Если не ошибаюсь, дельфовая обёртка умеет сама себя устанавливать, если запустить ваш сервис (как обычное приложения) с параметром -install.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Вы меня за идиота держите?
Компилирую(Без запуска). Устанавливаю сервис в систему. Иду в службы. Запускаю, приостанавливаю, продолжаю, перезапускаю, останавливаю. Деинсталирую сервис из системы. Результат: Цитата:
|
|
![]() |
![]() |
![]() |
#10 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
В общем разобрался я:
Код:
Цитата:
Почему при коде: Код:
Если убрать Timer.Enabled:=True; то все работает.. Последний раз редактировалось Человек_Борща; 04.07.2011 в 17:26. |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
После сохранения в файл *.xls при открытии этого файла выдается предупреждение. Как от этого избавиться? | A-IX-2 | Общие вопросы Delphi | 1 | 13.11.2011 20:33 |
После пятой цифры макрос должен ставить дефис | Manonia | Microsoft Office Excel | 4 | 22.03.2010 10:15 |
Удаление кнопки после первого запуска программы | keet | Помощь студентам | 5 | 09.01.2010 23:35 |
Вот и верь СМИ после этого | Роман Радер | Свободное общение | 13 | 29.10.2009 17:40 |
После запуска Торрента - загрузка проца 100% ??? | spamer | Компьютерное железо | 11 | 29.04.2009 09:00 |