![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибки при запуске сервиса [D6, WinXP]
Slaga © (2006-01-11 11:21:00)Такая проблема, написал такой сервис который запускает некое предложение как:
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: Служба не ответила на запрос своевременно.
Подскажите пожалуйста в чем может быть дело.
slaga (2006-01-12 10:13:00) [1]Нет нужды, так как все уже реализовано в первоначальной программе, для которой и пишется сервис, причем программа эта нужна как в виде сервиса так и в виде простого приложения.
Digitman (2006-01-12 08:48:00) [2]
> Execute порождает отдельные потоки в которых и выполняется
> основная работа
а что, использовать для "основной работы" доп.поток самого сервиса нет возможности ?
slaga (2006-01-11 18:38:00) [3]Дело в том что 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-11 18:32:00) [4]и как долго у тебя исполняется вызов метода fmMain.acStartServer.Execute ?
как вообще твой сервис реагирует на команду останова ?
slaga (2006-01-11 18:24:00) [5]в OnExecute ничего не происходит
Digitman (2006-01-11 18:14:00) [6]
> fmMain.Show;
> ShowMessage(
в контексте доп.трэда это недопустимо !
а что, собственно, творится в OnExecute ?
slaga (2006-01-11 18:10:00) [7]ну вот что сейчас реально у меня есть:
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:00:00) [8]
> чем собственно не нравится Show
Мне не нравится твое утверждение, что после переноса тобой упомянутого изначально кода (хоть с Show хоть с SowModal - безразлично) в обработчик OnStart у тебя "все нормально".
Digitman (2006-01-11 17:57:00) [9]
> slaga © (11.01.06 17:53) [19]
Значит горбатого лепишь : не переносил ты ни ShowModal ни Show в OnStart
slaga (2006-01-11 17:57:00) [10]а чем собственно не нравится Show ?
slaga (2006-01-11 17:53:00) [11]:))
да нет, на самом деле все нормально, сервис работает и сервер работает
Digitman (2006-01-11 17:38:00) [12]
> поменял на Show
хрен редьки не слаще
slaga (2006-01-11 17:32:00) [13]нет, я его поменял на Show
Digitman (2006-01-11 17:07:00) [14]что, и ShowModal туда переместил ?
это недопустимо
slaga (2006-01-11 17:05:00) [15]ну вот исходя из этого я все переместил в ОнСтарт/ОнСтоп
Digitman (2006-01-11 16:58:00) [16]
> slaga © (11.01.06 16:52) [13]
"светлые мысли" должны базироваться на одном весьма важном факте : обработка событий TService.OnCreate/OnDestroy выполняется в контексте осн.трэда процесса сервиса, в то время как обработка любых прочих событий TService - в контексте дополнительного трэда
slaga (2006-01-11 16:52:00) [17]:)
ну это по ходу обсуждения меня посещали более светлые мысли
Digitman (2006-01-11 16:46:00) [18]
> описанное выше вызывается в TService в событии ServiceCreate
противоречие наблюдается :
с одной стороны
> описанное выше вызывается в TService в событии Service Create
с другой
> при Он Стартесервиса, у меня создается и запускается в работу
> мой сервер
и в том и в другом случае речь идет якобы о "запуске работы сервера"
"Как понимать тебя, Саид ?" (с) Черный Абдула
Eraser (2006-01-11 16:22:00) [19]
> Digitman © (11.01.06 12:01) [5]
>
> Это не так делается.
> Пишется отдельно приложение-сервис и отдельно GUI (или консольное)
> приложение-монитор для контроля/управления работой сервиса.
>
....
> slaga ©
Ещё, как особо изощрённый вариант, чтобы не делать 2 exe файла, можно этот "монитор" сделать в составе exe сервиса, чтобы при запуске программы, как обычного приложения, запускалась только "мониторная" часть.
slaga (2006-01-11 15:57:00) [20]как было дело ...
Изначально была написана прогу, которая должна была работать как некий сервер, потом нужно было сделать сервис под этот сервер, вот я и сделал сервис как надстройку над сервером.
Теперь получается что при ОнСтарте сервиса, у меня создается и запускается в работу мой сервер.
Вот так вот.