![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не подскажете как из сервиса создать форму, показать ее на экране [D7, WinXP]
h0use © (2003-10-29 15:24:00)
Вот, уважаемые мастера, кусок с котрым я никак не могу совладать:
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 появляется только после закрытия формы :(
Spinx (2003-10-30 12:35:00) [1]
> h0use © (29.10.03 16:39) [13]
> 1. Почему компонент indy TCPServer активизированный в onStart
> не работает?
твоя служба запускается раньше службы TCP/IP.
поставь в Dependencies твоей службы, службу TCP/IP, тогда все пучком будет.
С уважением Александр.
Digitman (2003-10-29 17:57:00) [2]
> ServiceThread.Terminate;
а это вообще лишнее ... и даже вредное в некоторых случаях !
этот флаг быдет выставлен без твоего участия, как только ты вернешь Stopped := True;
оч полезно порой в исходники Борланда заглядывать) ... они писаны не для Пушкина
Digitman (2003-10-29 17:50:00) [3]
> сервисному потоку должно быть пофигу.
ему-то, может, и "пофигу") ... а вот процессу, породившему сервисный поток, далеко не "пофигу" ... ибо он не завершится, пока активен хоть один доп.код.поток... который потенциально м.б. создан ADO-компонентами
после
Stopped := True;
поставь LogMessage() и убедись что Stopped действительно равен True непосредственно перед выходом из обработчика OnStop()
h0use (2003-10-29 17:36:00) [4]
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:21:00) [5]
> если я хочу отсановить сервис, мне говорят о невозможности
> сделать это
это всего лишь значит, что обработчик OnStop() не вернул в переменной Stopped значение = True
procedure TMySvc.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
....
Stopped := лог_выражение_с_True_результатом; // раз эта строчка не выполнилась , сервис не может быть остановлен
end;
вот так) ... не более и не менее того !
а почему не выполнилась - тебе искать самому)
h0use (2003-10-29 17:14:00) [6]
Ладно..на счет этого пока я сам еще до конца не разобрался. Но вот что получается. Да то что ты сказал просто замечательно и форма создается и информация вроде идет, НО если я хочу отсановить сервис, мне говорят о невозможности сделать это. Получается, что я могу отановить сервис только когда прибью приложение в памяти по Ctrl-Alt-Del...Как это обойти? Выход по Close в форме не работает.
Digitman (2003-10-29 16:54:00) [7]
> h0us
как это - "обрабатываться формой" ? мне понятно - "выполнение таких-то действий в теле такого-то метода (вызванного в таком-то кодовом потоке) такого-то объекта" ... что есть "обрабатывается формой" - на уровне догадок)
h0use (2003-10-29 16:49:00) [8]
> Digitman © (29.10.03 16:44) [14]
>
> какое отношение это имеет к изначальному вопросу ?
Потому что все это должно обрабатываться форомй которая создается
Digitman (2003-10-29 16:44:00) [9]
> 1. Почему компонент indy TCPServer активизированный в onStart
> не работает?
понятия не имею, почему он у тебя не работает... обязан работать !
> 2. Почему логфайл котрый пишется
какое отношение это имеет к изначальному вопросу ?
h0use (2003-10-29 16:39:00) [10]
> Digitman © (29.10.03 16:31) [12]
>
> выполняются в осн.код.потоке сервис-приложения, прочие
> - в доп.код.потоке
Хорошо, но тогда скажи мне:
1. Почему компонент indy TCPServer активизированный в onStart не работает?
2. Почему логфайл котрый пишется в поток а затем при onStop скидывается в файл этого не делает,а при каждом новом запуске создает файл заного?
Я спрашиваю, потому что, если это приложение запустить просто (не как сервис) то эти два пункта работают.
Digitman (2003-10-29 16:31:00) [11]
> h0use
> как методы onCreate и onDestroy сочетаются с onSart и onStop?
а никак не сочетаются) .. из разных опер действо !
объединяет все это лишь последовательность возникновения событий
OnCreate -> OnStart() -> OnStop() -> OnDestroy()
обработчики первого и последнего событий в этой цепочке выполняются в осн.код.потоке сервис-приложения, прочие - в доп.код.потоке
h0use (2003-10-29 16:22:00) [12]
> Игорь Шевченко © (29.10.03 16:02) [8]
> Создавай невидимую, когда user залогинится, показывай ее
А винде "плохо" не будет что форма создастся до того как explorer запустится?
h0use (2003-10-29 16:21:00) [13]
> Digitman © (29.10.03 16:05) [9]
> чушь. почему это "не можешь" ? оч даже можешь
Хорошо, а как методы onCreate и onDestroy сочетаются с onSart и onStop?
Digitman (2003-10-29 16:05:00) [14]
> h0use
> А на ServiceCreate не могу я создавать форму
чушь. почему это "не можешь" ? оч даже можешь)
Игорь Шевченко (2003-10-29 16:02:00) [15]
h0use © (29.10.03 15:54)
Создавай невидимую, когда user залогинится, показывай ее
h0use (2003-10-29 15:56:00) [16]
> Digitman
Тогда скажи как отследить что пользователь залогинился и в нужном потоке создать форму?
h0use (2003-10-29 15:54:00) [17]
to Digitman
А на ServiceCreate не могу я создавать форму, потому что сервис стартует при старте системы и форму рсует, только когда юзер логинится.
Digitman (2003-10-29 15:52:00) [18]
> h0use
не может она "виснуть" в моем варианте) ... ибо создается и уничтожается она в осн.код.потоке процесса
а вот в твоем случае - в дополнительном... без синхронизации с осн.потоком ... оттого у тебя и проблемы
h0use (2003-10-29 15:48:00) [19]
Теперь выглядит так
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 виснет и все.
h0use (2003-10-29 15:45:00) [20]
Все супер, только при твоем варианте, запущенная форма виснет.