Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.49 MB
Время: 0.013 c
9-37482
15teen
2003-06-30 00:04
2004.01.13
Алгоритм для игры пятнашки


3-37493
_jek
2003-12-16 17:13
2004.01.13
ACCESS и спецификация


3-37533
User_OKA
2003-12-16 10:33
2004.01.13
Триггер


1-37677
Witcher
2003-12-26 13:07
2004.01.13
Системы счисления


14-37905
Wistler
2003-12-21 12:59
2004.01.13
Оптимальные деревья





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский