Вниз
Скачать: CL | DM;

Форма в 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.012 c
6-31371
Администратор
2003-05-02 15:34
2003.07.10
Подключениие к И Н Е Т У :)


6-31372
Shadow
2003-05-02 19:44
2003.07.10
Проблема с INDY idFTP


1-31313
Sergey26
2003-06-26 16:17
2003.07.10
Остановка


1-31293
_mandrake_
2003-06-25 15:05
2003.07.10
Image.Picture. SaveToFile()


4-31576
-= Demon =-
2003-05-07 16:16
2003.07.10
CreateProcess




   Наверх