Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];

Вниз

Форма в TService   Найти похожие ветки 

 
andrey__   (2003-06-27 13:34) [0]

Я добавил в TServiceApplication форму.
Моя служба при запуске показывает форму (Form1.Show ), и все работает нормально пока не останавливаешь службу. При остановке служба останавливается, форма закрывается но выдается ошибка:

"Исключение неизвестное програмное исключение (0х0ееdfade) в приложении по адресу 0х7е98bb".

Но если я не делаю Form1.Show служба останавливается без ошибок


 
andrey__   (2003-06-27 14:19) [1]

Ало кто-нибудь.
Если надо что-то пояснить пишите.


 
Empleado   (2003-06-27 14:23) [2]

Класс !

Help -> TServiceApplication -> Note:


 
Digitman   (2003-06-27 14:24) [3]

форма является VCL-объектом.

обращение ко VCL-объектам , как правило, д.б. синхронизировано с осн.потоком процесса VCL-приложения, если обращение происходит из доп.код.потока.

ServiceApplication же для каждого контролируемого им сервиса создает именно доп.код.поток, в котором ты, нарушая вышеуказанное требование, и пытаешься сделать то, что приводит к фатальному исключению.


 
andrey__   (2003-06-27 14:39) [4]

что делать?
Как синхронизировать?


 
ggsoft   (2003-06-27 14:48) [5]


> Empleado © (27.06.03 14:23)

Да пофиг этот "No-o-ote", кто мешает явно указывать чей объект Application использовать - SvcMgr.Application, Forms.Application?


> andrey__ (27.06.03 14:39)

Если есть желание, я тебе скину на e-mail, твою службу (тот код, который ты приводил ранее), с примером как использовать формы в службах для отладки, кроме того данный вариант позволяет запускать "псевдо-службу" на системах не только WinNT, но и Win9X.


 
Digitman   (2003-06-27 14:49) [6]

TServiceThread есть прямой наследник TThread
у TThread есть метод Synchronize()
им и можно воспользоваться в ряде случаев


 
andrey__   (2003-06-27 15:22) [7]

> ggsoft © (27.06.03 14:48)
я отправил тебе e-mail. Пришли пожалуста.


 
andrey__   (2003-06-27 15:55) [8]

>Digitman © (27.06.03 14:49)

если можеш объясни на примере.

unit UnitMy;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ActnList, StdActns;

type
TService5 = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
Service5: TService5;

implementation

uses Unit1;

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service5.Controller(CtrlCode);
end;

function TService5.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TService5.ServiceStart(Sender: TService; var Started: Boolean);
var
temp:Tform1;
begin
Application.CreateForm(TForm1, temp);
temp.Show;
end;

end.




 
Digitman   (2003-06-27 16:11) [9]


unit UnitMy;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ActnList, StdActns;

type
TService5 = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
private
{ Private declarations }
temp: TForm1;
procedure DoCreateAndShowForm;
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
Service5: TService5;

implementation

uses Unit1;

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service5.Controller(CtrlCode);
end;

function TService5.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TService5.DoCreateAndShowForm;
begin
Application.CreateForm(TForm1, temp);
temp.Show;
end;

procedure TService5.ServiceStart(Sender: TService; var Started: Boolean);
begin
Sender.ServiceThread.Synchronize(DoCreateAndShowForm);
end;

end.


 
Armen   (2003-06-27 17:01) [10]

внесто Application.CreateForm(TForm1, temp);
temp:=TForm1.Create(...);
temp.Show;


 
andrey__   (2003-06-27 17:08) [11]

Ругается в строке

Sender.ServiceThread.Synchronize(DoCreateAndShowForm);

[Error] UnitMy.pas(49): Undeclared identifier: "Synchronize"


 
Digitman   (2003-06-27 17:10) [12]


> Armen


и какая, спрашивается, разница ?


 
Digitman   (2003-06-27 17:36) [13]


> andrey__


ах дааа !) .. он же - protected)

ну тогда придется переопределять некоторые вирт.методы TService, так чтобы вместо класса TServiceThread они работали с создаваемым тобой наследником TMyServiceThread = class(TServiceThread);

в принципе ничего сложного в этом нет



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
1-31258
picaroon
2003-06-29 16:41
2003.07.10
Как очистить текстовый файл?


14-31441
XobBIT
2003-06-23 08:45
2003.07.10
Как открыть chm файл на нужной странице(topic)?


14-31465
Феликс
2003-06-22 18:54
2003.07.10
Епископ-гей: скандал сотрясает церковь


1-31261
Behemoth
2003-06-26 10:06
2003.07.10
Поможите с модальными формами...


14-31516
aga
2003-06-20 22:05
2003.07.10
CD-RW





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский