Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.042 c
15-1136005533
antonn
2005-12-31 08:05
2006.01.29
новогодний рингтон


1-1135466459
Bakset
2005-12-25 02:20
2006.01.29
Вопрос про сервисы для гуру...


2-1136886100
Kot_
2006-01-10 12:41
2006.01.29
Как узнать запущена программа на другом компьютере или нет?


2-1136731237
начинающий 5
2006-01-08 17:40
2006.01.29
string


2-1136903460
@gent
2006-01-10 17:31
2006.01.29
Форма одна или много ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский