Форум: "Начинающим";
Текущий архив: 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