![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TService не дружыт с ADODB [D7, WinXP]
Max Zyuzin © (2005-12-09 09:42:00)Приветствую всех!
Не уверен с правильностью конфы... но
Пишу сервис, который должен по таймеру обрабатывать подошедшие файлики, обработка заключается в отправке различных SQL запросов на MSSQL сервер.
Значит создал сервис покидал на него таймер, TADOConnceion и TADOCommand
У сервиса onCreate читаю данные их ini файла все читается и страртуется таймер.
По событию таймера происходит обработка (процедура выполняется)...
Собственно она выполняется ровно до тех пор пока я не попытаюсь обратится к любому компоненту ADO причем не важно как... например
MainADOCommand.CommandText := 'begin transaction';
Сервис уходит в себя и умирает тихо... что делать?
Digitman (2005-12-09 15:29:00) [1]
> есть какие нить варианты?
см., например, ReadDirectoryChangesW
Max Zyuzin (2005-12-09 12:34:00) [2]>Digitman © (09.12.05 12:08) [9]
Первое что в голову пришло... (по поводу таймера) есть какие нить варианты?
А сервис понадобился, что бы работать не зависимо от основной программы, он будет работать на сервере и тихо, мирно перелопачивать все что приезжает, даже когда никто на сервер не залогинен...
Digitman (2005-12-09 12:08:00) [3]все это расчудесно ..
не понятно только одно - нафих тут сервис вообще нужен ... если целевой код выполняется в контексте осн.трэда процесса, точно так же как он мог бы быть выполнен в контексте осн.трэда любого другого (не сервис) процесса
и к тому же обнаруживать "подошедшие файлики" по событиям таймера крайне неразумно
Max Zyuzin (2005-12-09 11:56:00) [4]>Digitman © (09.12.05 11:15) [7]
В общем разобрался я в этой проблемме... вы будете смеятся, но все заключалось в том, что сначала я создавал объекты ADO динамически,
в try... finally и перед созданием загонял все значения переменных в Nil компилятор пердупреждение выдавал.
Потом решил отказаться и создал в Disign-Time все эти объекты, закоментарил все кроме обнуленя переменных :( в результате у меня при обработке и говорило что я с удба рухнул ибо нету нифига не одного объекта ADO
Спасибо большое за помощь.
Digitman (2005-12-09 11:15:00) [5]
> я так понял что все объекты созданые на OnCreate у сервиса
> не видны из обработчика событий у объекта TTimer?
Не правильно ты понял.
Видимость здесь ни при чем.
Видимость идентификатора - понятие, относящееся к compile-time, а не к run-time.
> как сделать что бы это событие обрабатывалось в основном
> потоке сервиса?
Оно и будет обрабатываться в основном потоке сервис-процесса, если строчка Timer.Enabled := True будет выполнена в нем же, а именно - в OnCreate/Destroy.
При этом создается невидимое окно, и сообщения WM_TIMER будут посылаться системой в адрес этого окна... а поскольку окно было создано в контексте осн.код.потока процесса, то и его обработчик (вызывающий, в кон.итоге OnTimer) так же будет вызываться/исполняться в том же контексте.
Max Zyuzin (2005-12-09 10:54:00) [6]>Digitman © (09.12.05 10:19) [5]
То есть я так понял что все объекты созданые на OnCreate у сервиса не видны из обработчика событий у объекта TTimer?
А как сделать что бы это событие обрабатывалось в основном потоке сервиса?
Digitman (2005-12-09 10:19:00) [7]OnCreate и OnDestroy любого объекта TService сервис-приложения выполняются в контексте основного кодового потока соответствующего сервис-процесса.
Все прочие события любого объекта TService того же сервис-приложения выполняются в контекстах соответствующих доп.кодовых потоков, ассоциированных с соответствующими объектами TServiceThread этого сервис-процесса.
Digitman (2005-12-09 10:15:00) [8]
> Max Zyuzin © (09.12.05 10:12) [3]
> в моем случае всего один поток, и один сервис
что есть "твой случай" ?
надо понимать, кроме OnCreate и OnDestroy никакие иные события TService ты никак не обрабатываешь ?
Max Zyuzin (2005-12-09 10:12:00) [9]>Digitman © (09.12.05 10:00) [2]
Гм... звучит убедитльно. Почитал про Service Threads но в моем случае всего один поток, и один сервис.
Digitman (2005-12-09 10:00:00) [10]
> что делать?
разобраться с кодовыми потоками, в контексте которых исполняются те или иные обработчики событий объектов-наследников класса TService
Max Zyuzin (2005-12-09 09:43:00) [11]Извиняюсь за ошибки...