Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

Не подскажете как из сервиса создать форму, показать ее на экране   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
1-37635
gai
2003-12-26 23:01
2004.01.13
Печать из Word а без лишнего писка


14-37897
z.Evgen
2003-12-19 08:45
2004.01.13
Как можно разбить строку на символы?


1-37735
Evgeny78
2003-12-30 13:06
2004.01.13
OLE Automation


3-37524
OlegM
2003-12-16 10:00
2004.01.13
Добавить изображение в Blob поле


14-37919
SergP
2003-12-20 11:25
2004.01.13
(NMHTTP, IDHTTP) POST & PHP . Еще одна проблема...