Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Service   Найти похожие ветки 

 
Urgen ©   (2005-08-10 14:38) [0]

Здравствуйте
 есть сервайс1 он зависит от сервайса2.
сервайсов1 может быть несколько...
сервайс1 работает с com объектом
чтобы несколько сервайсов1 работали только с одним com объектом сначала стартует сервайс2(он запускает com объект).

Проблема
 сервайс 2 при старте windowsXP, зависает при вызове CreateOleObject минут на 5-6... непонятно почему... потом очень быстро отрабатывает...
 сервайсы1 не дождавшись умирают. (если запускать в ручную то все происходт отлично)

Вопрос
 Почему это происходит? ( dcom? )
 Как это победить?

com объект - Iconics AutoGenRegisrar (кто знаком)


 
Rouse_ ©   (2005-08-10 15:43) [1]

Манипулируй dwCheckPoint и dwWaitHint по приходу
управляющего кода SERVICE_CONTROL_INTERROGATE, в первом сервисе пока он ждет инициализации второго сервиса, в этот момент dwCurrentState должен быть выставлен в SERVICE_START_PENDING...


 
Urgen ©   (2005-08-11 07:11) [2]

В Сервайсе2 по таймеру выполняется ReportStatus.
(не смотря на ReportStatus в логах пишет что служба Сервайс2 зависла)

Cервайсы написанны от TServiceApplication

В момент "оживания" сервайса (через 5-6 минут) система виснет (explorer.exe) потом через минуту оживает..


 
Urgen ©   (2005-08-11 07:54) [3]

Ладно, черт с этим...
Вот другой вопрос почему в Сервайсе1 может происходить ошибка Win32error code 5 Отказанно в доступе?
(в Сервайсе1 есть форма)


 
Digitman ©   (2005-08-11 08:24) [4]


> В Сервайсе2 по таймеру выполняется ReportStatus


таймер работает в трэде сервиса или в осн.трэде сервис-процесса ?


> в Сервайсе1 есть форма


зачем сервису форма ?


> почему в Сервайсе1 может происходить ошибка Win32error code
> 5 Отказанно в доступе?


какая-то из winapi-ф-ций вернула эту ошибку
очевидно, не все в порядке с правами на доступ к ресурсам/объектам системы со стороны сервиса


 
Urgen ©   (2005-08-11 10:49) [5]

таймер работает в трэде сервиса

// зачем сервису форма ?
Зачем outpost-у форма

ну, по поводу того, что это какая-то winapi функция, я смутно догадывался...  :)
А вобще мне кажется что это связанно с отображением формы в момент запуска...


 
Digitman ©   (2005-08-11 11:04) [6]


> таймер работает в трэде сервиса


и что по очередному тику таймера делается в теле ReportStatus() ?


> Зачем outpost-у форма


сомневаюсь, что это лучший и единственный способ интерактивного взаимодействия с процессом сервиса

зачем сервис-приложению форма ?

на то есть обычное приложение или cpl-приложение - при старте оно организует коммуникационный канал, по которому обменивается данными с сервисом, и данные инф.обмена с сервисом изображает в формах интерактивного взаимодействия с пользователем


> по поводу того, что это какая-то winapi функция, я смутно
> догадывался


зачем догадываться-то ?

севис же можно отлаживать/трассировать средствами встр.отладчика Делфи точно так же как и любого рода иное Делфи-приложение


> вобще мне кажется что это связанно с отображением формы
> в момент запуска


запуска чего ? сервис-процесса как такового или запуска некоего сервиса в составе сервис-приложения ?

сервис-приложение в общем случае может реализовать более чем один сервис


 
Sumor   (2005-08-11 11:54) [7]

Сервису можно указать, что он зависит от каких-то других сервисов. Соответственно если поставить зависимость сервиса_1 от сервиса_2, то система (в данном случае XP) запустит сервис_1 только после того, как успешно запустится твой сервис с com-объектом.
Опять же при старте WinXP какой-то сервис (системный), который должен отвечать за сохдание com-объектов ещё не успел загрузиться, поэтому система и ждёт пока загрузятся необходимые системные службы. Как только всё загрузилось - всё должно работать.


 
Urgen ©   (2005-08-11 12:13) [8]

TService.WaitHint
If the service performs a lengthy operation of more than WaitHint time in one of its event handlers, you should call ReportStatus method to update to the Service Control Manager.

Согласен, что такой канал хорош и это было бы правильней. Но сейчас не до красоты...
С отладчиком тоже не все хорошо... не получается...

> запуска чего ? сервис-процесса как такового или запуска некоего сервиса в составе сервис-приложения ?
В момент перезагрузки компьютера
вообще сервис один в сервис приложении


 
Digitman ©   (2005-08-11 12:42) [9]


> Urgen ©   (11.08.05 12:13) [8]


приведи код обработчика TService.OnStart/OnStop/OnExecute


 
Urgen ©   (2005-08-11 13:19) [10]


OnStart - пусто. оставил так... потому что не видел смысла

OnStop
begin
 DoStop;  // уничтожение формы
 Stopped := True;
end;

OnExecute
begin
 AppSetShowMainForm;
 Application.CreateForm(TWMain, WMain);
 WMain.Autostart := True;
 WMain.Initialize;
 WMainDoStop := False;
 WMain.Show;
 AppMinimize;

 while (not Terminated)  do
 begin
//    AppHandleMessage;
   Sleep(1);
   ServiceThread.ProcessRequests(False);
   if Terminated then
   begin
     break;  
   end;
   if WMainDoStop then
   begin
     DoStop;
     break;
   end;
 end;
end;

procedure DoStop
begin
 WMAIN.Close;
 WMAIN.Free;
end;

не получается дебагить. есть советы?


 
Digitman ©   (2005-08-11 13:26) [11]

э-э-э-э !

код твой, как говорят, "фтопку".

КАКОЕ право ты имеешь обращаться к VCL-объектам (тем более - визуальным !) в доп.трэде процесса ?


 
Digitman ©   (2005-08-11 13:38) [12]


> не получается дебагить. есть советы?


DevGuide: Programming with Delphi
Debugging service applications

You can debug service applications by attaching to the service application process when it is already running (that is, by starting the service first, and then attaching to the debugger). To attach to the service application process, choose Run|Attach To Process, and select the service application in the resulting dialog.

In some cases, this approach may fail, due to insufficient rights. If that happens, you can use the Service Control Manager to enable your service to work with the debugger:

1 First create a key called Image File Execution Options in the following registry location:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

2 Create a subkey with the same name as your service (for example, MYSERV.EXE). To this subkey, add a value of type REG_SZ, named Debugger. Use the full path to Delphi32.exe as the string value.
3 In the Services control panel applet, select your service, click Startup and check Allow Service to Interact with Desktop.

On Windows NT systems, you can use another approach for debugging service applications. However, this approach can be tricky, because it requires short time intervals:

1 First, launch the application in the debugger. Wait a few seconds until it has finished loading.
2 Quickly start the service from the Control Panel or from the command line:

start MyServ

You must launch the service quickly (within 15-30 seconds of application startup) because the application will terminate if no service is launched.


 
Urgen ©   (2005-08-11 13:55) [13]

почему нет. все нормально отрабатывало. (понимаю что не правильно) но иначе вроде никак

1 First, launch the application in the debugger. Wait a few seconds until it has finished loading.
Оно сразу завершается, не понятно почему

может через аську? check email


 
Digitman ©   (2005-08-11 14:13) [14]


> иначе вроде никак


как это "никак" ?

оч даже "как" !

TService.OnCreate/OnDestroy исполняются как раз в основном трэде сервис-процесса, и здесь самое подходящее место для непоср.создания VCL-объектов и обращения к их методам/св-вам.

Обработчики же ВСЕХ ПРОЧИХ событий объектов класса TService вызываются в контексте соответствующих конкретным сервисам (в составе сервис-приложения) доп.трэдам.

Судя по


> Urgen ©   (11.08.05 10:49) [5]
> таймер работает в трэде сервиса


и приведенному ниже коду ты соврал не моргнув - НИКАКИХ таймеров в этом коде я не вижу, при том что код этот исполняется именно в дополнительном, а не основном трэде сервис-процесса.


 
Urgen ©   (2005-08-11 15:03) [15]

ага ты прав - соврал Таймер в коде сервиса2, каторый работает вроде нормально, с ним проблем нет.

а если я создаю vcl объекты в дополнительном трэде процессаб так нормально?

OnCreate/OnDestroy тоже не прошло... На destroy wmain.Free ошибка Privileged instruction


 
Digitman ©   (2005-08-11 15:05) [16]


> если я создаю vcl объекты в дополнительном трэде процессаб
> так нормально?


строго наоборот - совершенно не нормально.


> На destroy wmain.Free ошибка Privileged instruction


значит ошибка там ... в 17-й строке ..


 
Digitman ©   (2005-08-11 15:07) [17]


> соврал Таймер в коде сервиса2


сервис2 пока не трогай, разберись с сервис1 - там у тебя полный бардак и неразбериха.



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

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
1-1127034318
Alexis
2005-09-18 13:05
2005.10.09
Парсинг алгебраических выражений (полиномов)


1-1126773921
Shrike
2005-09-15 12:45
2005.10.09
выделения в TCustomGrid


11-1107935104
ser_ker
2005-02-09 10:45
2005.10.09
Работа с БД через ODBC


3-1124719894
M@rlin
2005-08-22 18:11
2005.10.09
Не выполняется процедура SQL из Delphi


3-1125425983
Step[B.M.]
2005-08-30 22:19
2005.10.09
Работа с PostgreSQL через ODBC