Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не подскажете как из сервиса создать форму, показать ее на экране [D7, WinXP]


Страницы:   1 2

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]

Все супер, только при твоем варианте, запущенная форма виснет.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо