Форум: "Система";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
ВнизНе подскажете как из сервиса создать форму, показать ее на экране Найти похожие ветки
← →
h0use (2003-10-29 15:24) [0]Вот, уважаемые мастера, кусок с котрым я никак не могу совладать:
procedure TBAService.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
if (RegisterWindowMessage("TaskbarCreated")<>0) and (not flAllreadyShow) and flShowIcon then
begin
Application.CreateForm(TfmSrvMain, fmSrvMain);
fmSrvMain.ShowModal;
ShowMessage("Ta-DA");
flAllreadyShow:=True
end;
Sleep(100);
end;
end;
Что я делаю неверно? ShowMessage появляется только после закрытия формы :(
← →
Игорь Шевченко (2003-10-29 15:32) [1]А как иначе ? Это же ShowModal, значит на время отображения формы выполнение кода останваливается. Попробуй просто Show
← →
Digitman (2003-10-29 15:33) [2]
> Что я делаю неверно
практически все неверно
вот пример беспроблемного, простого и "правильного" создания формы:
procedure TMySvc.ServiceCreate(Sender: TObject);
begin
MyForm := TMyForm.Create(nil);
end;
procedure TMySvc.ServiceDestroy(Sender: TObject);
begin
MyForm.Free;
end;
← →
h0use (2003-10-29 15:45) [3]Все супер, только при твоем варианте, запущенная форма виснет.
← →
h0use (2003-10-29 15:48) [4]Теперь выглядит так
procedure TBAService.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
if flShowIcon then
if (RegisterWindowMessage("TaskbarCreated")<>0) and (not flAllreadyShow) then
begin
fmSrvMain:=TfmSrvMain.Create(nil);
flAllreadyShow:=True
end
Sleep(100);
end;
end;
но fmSrvMain виснет и все.
← →
Digitman (2003-10-29 15:52) [5]
> h0use
не может она "виснуть" в моем варианте) ... ибо создается и уничтожается она в осн.код.потоке процесса
а вот в твоем случае - в дополнительном... без синхронизации с осн.потоком ... оттого у тебя и проблемы
← →
h0use (2003-10-29 15:54) [6]to Digitman
А на ServiceCreate не могу я создавать форму, потому что сервис стартует при старте системы и форму рсует, только когда юзер логинится.
← →
h0use (2003-10-29 15:56) [7]> Digitman
Тогда скажи как отследить что пользователь залогинился и в нужном потоке создать форму?
← →
Игорь Шевченко (2003-10-29 16:02) [8]h0use © (29.10.03 15:54)
Создавай невидимую, когда user залогинится, показывай ее
← →
Digitman (2003-10-29 16:05) [9]
> h0use
> А на ServiceCreate не могу я создавать форму
чушь. почему это "не можешь" ? оч даже можешь)
← →
h0use (2003-10-29 16:21) [10]
> Digitman © (29.10.03 16:05) [9]
> чушь. почему это "не можешь" ? оч даже можешь
Хорошо, а как методы onCreate и onDestroy сочетаются с onSart и onStop?
← →
h0use (2003-10-29 16:22) [11]
> Игорь Шевченко © (29.10.03 16:02) [8]
> Создавай невидимую, когда user залогинится, показывай ее
А винде "плохо" не будет что форма создастся до того как explorer запустится?
← →
Digitman (2003-10-29 16:31) [12]
> h0use
> как методы onCreate и onDestroy сочетаются с onSart и onStop?
а никак не сочетаются) .. из разных опер действо !
объединяет все это лишь последовательность возникновения событий
OnCreate -> OnStart() -> OnStop() -> OnDestroy()
обработчики первого и последнего событий в этой цепочке выполняются в осн.код.потоке сервис-приложения, прочие - в доп.код.потоке
← →
h0use (2003-10-29 16:39) [13]
> Digitman © (29.10.03 16:31) [12]
>
> выполняются в осн.код.потоке сервис-приложения, прочие
> - в доп.код.потоке
Хорошо, но тогда скажи мне:
1. Почему компонент indy TCPServer активизированный в onStart не работает?
2. Почему логфайл котрый пишется в поток а затем при onStop скидывается в файл этого не делает,а при каждом новом запуске создает файл заного?
Я спрашиваю, потому что, если это приложение запустить просто (не как сервис) то эти два пункта работают.
← →
Digitman (2003-10-29 16:44) [14]
> 1. Почему компонент indy TCPServer активизированный в onStart
> не работает?
понятия не имею, почему он у тебя не работает... обязан работать !
> 2. Почему логфайл котрый пишется
какое отношение это имеет к изначальному вопросу ?
← →
h0use (2003-10-29 16:49) [15]
> Digitman © (29.10.03 16:44) [14]
>
> какое отношение это имеет к изначальному вопросу ?
Потому что все это должно обрабатываться форомй которая создается
← →
Digitman (2003-10-29 16:54) [16]
> h0us
как это - "обрабатываться формой" ? мне понятно - "выполнение таких-то действий в теле такого-то метода (вызванного в таком-то кодовом потоке) такого-то объекта" ... что есть "обрабатывается формой" - на уровне догадок)
← →
h0use (2003-10-29 17:14) [17]Ладно..на счет этого пока я сам еще до конца не разобрался. Но вот что получается. Да то что ты сказал просто замечательно и форма создается и информация вроде идет, НО если я хочу отсановить сервис, мне говорят о невозможности сделать это. Получается, что я могу отановить сервис только когда прибью приложение в памяти по Ctrl-Alt-Del...Как это обойти? Выход по Close в форме не работает.
← →
Digitman (2003-10-29 17:21) [18]
> если я хочу отсановить сервис, мне говорят о невозможности
> сделать это
это всего лишь значит, что обработчик OnStop() не вернул в переменной Stopped значение = True
procedure TMySvc.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
....
Stopped := лог_выражение_с_True_результатом; // раз эта строчка не выполнилась , сервис не может быть остановлен
end;
вот так) ... не более и не менее того !
а почему не выполнилась - тебе искать самому)
← →
h0use (2003-10-29 17:36) [19]procedure TBAService.ServiceStop(Sender: TService; var Stopped: Boolean);
var
f1,f2:Boolean;
begin
f1:=True;f2:=True;
if flBaseStat then f2:=BaseStop;
if flServerStat then f1:=ServerStop;
If f1 and f2 then SaveLog(1, "+ Successefully stopped.")
else SaveLog(1, "- Stopped with any errors.");
StopLogging;
// if assigned(CS) then FreeAndNil(CS);
ServiceThread.Terminate;
Stopped := True;
end;
Вроде все как надо идет. По идее если сокет не закрылся и ADO не расконектилась, сервисному потоку должно быть пофигу.
← →
Digitman (2003-10-29 17:50) [20]
> сервисному потоку должно быть пофигу.
ему-то, может, и "пофигу") ... а вот процессу, породившему сервисный поток, далеко не "пофигу" ... ибо он не завершится, пока активен хоть один доп.код.поток... который потенциально м.б. создан ADO-компонентами
после
Stopped := True;
поставь LogMessage() и убедись что Stopped действительно равен True непосредственно перед выходом из обработчика OnStop()
← →
Digitman (2003-10-29 17:57) [21]
> ServiceThread.Terminate;
а это вообще лишнее ... и даже вредное в некоторых случаях !
этот флаг быдет выставлен без твоего участия, как только ты вернешь Stopped := True;
оч полезно порой в исходники Борланда заглядывать) ... они писаны не для Пушкина
← →
Spinx (2003-10-30 12:35) [22]> h0use © (29.10.03 16:39) [13]
> 1. Почему компонент indy TCPServer активизированный в onStart
> не работает?
твоя служба запускается раньше службы TCP/IP.
поставь в Dependencies твоей службы, службу TCP/IP, тогда все пучком будет.
С уважением Александр.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c