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

Вниз

Ошибки при запуске сервиса   Найти похожие ветки 

 
Slaga ©   (2006-01-11 11:21) [0]

Такая проблема, написал такой сервис который запускает некое предложение как:

Application.CreateForm(TDM, DM);
if DM.OracleSession.Connected then
 begin
  Application.CreateForm(TfmMain, fmMain);
  try
   fmMain.ShowModal; //Открытие формы
   fmMain.acStartServer.Execute;// Запуск работы
  except
   on E:Exception do
    begin
     ShowMessage(E.Message);
     fmMain.Close;
    end;
  end;
 end;


при запуске сервиса как start ScaleSrvSrv.exe все работает, но если его запускать через Службы-Запуск, то вроде тоже запускается но через определенный таймаут выдает ошибку:

Не удалось запустить службу Scale Server Service на Локальный компьютер.

Ошибка 1053: Служба не ответила на запрос своевременно.


Подскажите пожалуйста в чем может быть дело.


 
Digitman ©   (2006-01-11 11:28) [1]


> написал такой сервис


не сервис ты написал, а обычное GUI-приложение


 
Slaga ©   (2006-01-11 11:33) [2]

описанное выше вызывается в TService в событии ServiceCreate


 
Digitman ©   (2006-01-11 11:45) [3]

ну и зачем сервису формы ? да еще и модальные ?


 
slaga ©   (2006-01-11 11:49) [4]

Мне нужно, что б у сервиса была возможность визуального управления


 
Digitman ©   (2006-01-11 12:01) [5]

Это не так делается.
Пишется отдельно приложение-сервис и отдельно GUI (или консольное) приложение-монитор для контроля/управления работой сервиса.

Взаимодействие между этими двумя приложениями организуется, например, средставами именованых программных каналов (в случае ЛВС) либо, например, с использованием одного из протоколов в составе TCP/IP-стека протоколов (в случае глоб.сети) .. в пределах одной и той же раб.станции под упр-ем Windows простейший инф.обмен можно организовать и средствами механизма оконных сообщений


 
Leonid Troyanovsky ©   (2006-01-11 12:26) [6]


> Digitman ©   (11.01.06 12:01) [5]

> . в пределах одной и той же раб.станции под упр-ем Windows
> простейший инф.обмен можно организовать и средствами механизма
> оконных сообщений


Это в пределах одного десктопа.
Т.е., лучше уж через mmf.

--
Regards, LVT.


 
Digitman ©   (2006-01-11 12:27) [7]


> Leonid Troyanovsky ©   (11.01.06 12:26) [6]
> Это в пределах одного десктопа


Это подразумевалось.
Не суть как важно на дан.этапе рассмотрении вопроса.


 
slaga ©   (2006-01-11 12:43) [8]

ну вообщем то я согласен что так надо, просто уже есть кое что сделано "вот так" а времени на перделку нет ...

ну вообщемто проблему я уже решил

все дело было в CoInitialize(nil)

тоесть сервис не стартовал потому что не могло проинициализироваться АДО, которое я проинициализировал сам...


 
Digitman ©   (2006-01-11 12:49) [9]


> все дело было в CoInitialize(nil)


Тогда непонятно, как твой сервис при этом вообще работал, будучи запущенным средствами net start ..

> fmMain.acStartServer.Execute;// Запуск работы

Что у тебя происходит при этом ?


 
slaga ©   (2006-01-11 15:57) [10]

как было дело ...

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

Теперь получается что при ОнСтарте сервиса, у меня создается и запускается в работу мой сервер.

Вот так вот.


 
Eraser ©   (2006-01-11 16:22) [11]


> Digitman ©   (11.01.06 12:01) [5]
>
> Это не так делается.
> Пишется отдельно приложение-сервис и отдельно GUI (или консольное)
> приложение-монитор для контроля/управления работой сервиса.
>
....


> slaga ©

Ещё, как особо изощрённый вариант, чтобы не делать 2 exe файла, можно этот "монитор" сделать в составе exe сервиса, чтобы при запуске программы, как обычного приложения, запускалась только "мониторная" часть.


 
Digitman ©   (2006-01-11 16:46) [12]


> описанное выше вызывается в TService в событии ServiceCreate


противоречие наблюдается :

с одной стороны

> описанное выше вызывается в TService в событии ServiceCreate


с другой


> при ОнСтарте сервиса, у меня создается и запускается в работу
> мой сервер


и в том и в другом случае речь идет якобы о "запуске работы сервера"

"Как понимать тебя, Саид ?" (с) Черный Абдула


 
slaga ©   (2006-01-11 16:52) [13]

:)

ну это по ходу обсуждения меня посещали более светлые мысли


 
Digitman ©   (2006-01-11 16:58) [14]


> slaga ©   (11.01.06 16:52) [13]


"светлые мысли" должны базироваться на одном весьма важном факте : обработка событий TService.OnCreate/OnDestroy выполняется в контексте осн.трэда процесса сервиса, в то время как обработка любых прочих событий TService - в контексте дополнительного трэда


 
slaga ©   (2006-01-11 17:05) [15]

ну вот исходя из этого я все переместил в ОнСтарт/ОнСтоп


 
Digitman ©   (2006-01-11 17:07) [16]

что, и ShowModal туда переместил ?
это недопустимо


 
slaga ©   (2006-01-11 17:32) [17]

нет, я его поменял на Show


 
Digitman ©   (2006-01-11 17:38) [18]


> поменял на Show


хрен редьки не слаще


 
slaga ©   (2006-01-11 17:53) [19]

:))

да нет, на самом деле все нормально, сервис работает и сервер работает


 
slaga ©   (2006-01-11 17:57) [20]

а чем собственно не нравится  Show ?


 
Digitman ©   (2006-01-11 17:57) [21]


> slaga ©   (11.01.06 17:53) [19]


Значит горбатого лепишь : не переносил ты ни ShowModal ни Show в OnStart


 
Digitman ©   (2006-01-11 18:00) [22]


> чем собственно не нравится  Show


Мне не нравится твое утверждение, что после переноса тобой упомянутого изначально кода (хоть с Show хоть с SowModal - безразлично) в обработчик OnStart у тебя "все нормально".


 
slaga ©   (2006-01-11 18:10) [23]

ну вот что сейчас реально у меня есть:

procedure TScaleServerService.ServiceStart(Sender: TService;
 var Started: Boolean);
var
 NeedToUninitialize: Boolean;
begin
  NeedToUninitialize := Succeeded(CoInitialize(nil));
try
  Started := True;
  try
   Application.CreateForm(TDM, DM);
   if DM.OracleSession.Connected then
    begin
     Application.CreateForm(TfmMain, fmMain);
     try
      fmMain.acStartServer.Execute;
      fmMain.Show;
     except
      on E:Exception do
       begin
        ShowMessage("Ïðîèçîøëà îøèáêà çàïóñêà ñåðâèñà ScaleSrvSrv: "+E.Message);
        fmMain.Close;
       end;
     end;
    end;
  except
   on E:Exception do
    ShowMessage("Ïðîèçîøëà îøèáêà çàïóñêà ñåðâèñà ScaleSrvSrv: "+E.Message);
  end;
finally
 if NeedToUninitialize then CoUninitialize;
end;
end;


 
Digitman ©   (2006-01-11 18:14) [24]


> fmMain.Show;


> ShowMessage(


в контексте доп.трэда это недопустимо !

а что, собственно, творится в OnExecute ?


 
slaga ©   (2006-01-11 18:24) [25]

в OnExecute ничего не происходит


 
Digitman ©   (2006-01-11 18:32) [26]

и как долго у тебя исполняется вызов метода fmMain.acStartServer.Execute ?

как вообще твой сервис реагирует на команду останова ?


 
slaga ©   (2006-01-11 18:38) [27]

Дело в том что  fmMain.acStartServer.Execute порождает отдельные потоки в которых и выполняется основная работа, так что как долго он выполняется не имеет значения.

А насчет останова:

procedure TScaleServerService.ServiceStop(Sender: TService;
 var Stopped: Boolean);
begin
fmMain.acStopServer.Execute;
fmMain.free;
DM.Free;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 ScaleServerService.Controller(CtrlCode);
end;

function TScaleServerService.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;


 
Digitman ©   (2006-01-12 08:48) [28]


> Execute порождает отдельные потоки в которых и выполняется
> основная работа


а что, использовать для "основной работы" доп.поток самого сервиса нет возможности ?


 
slaga ©   (2006-01-12 10:13) [29]

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



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

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

Наверх




Память: 0.54 MB
Время: 0.044 c
6-1129584117
Lord_of_Darkness
2005-10-18 01:21
2006.01.29
Рдновременный прием TServerSocket ом файлов от нескольких клиенто


3-1133431575
Juice
2005-12-01 13:06
2006.01.29
CDS: Отмена изменений Delta без внесения ее в Data


2-1136991534
ROOT
2006-01-11 17:58
2006.01.29
Неработает ApplyUpdates(-1);


2-1136728923
AlexOld
2006-01-08 17:02
2006.01.29
Копирование двух массивов в один


15-1136901397
psa247
2006-01-10 16:56
2006.01.29
Драйвер FileMon !