Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.10;
Скачать: 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 вся ветка

Текущий архив: 2003.07.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
3-31085
_Dimitry
2003-06-16 13:10
2003.07.10
Как остановить выполнение ADOQuery.Execute ?


7-31556
Alex-21
2003-04-23 22:09
2003.07.10
Screensaver


14-31474
HolyGlory
2003-06-24 11:53
2003.07.10
Отлаживаю 186 - проблемка :(


8-31369
spogi
2003-03-23 01:44
2003.07.10
FileListBox + problema=?


8-31368
Катерина
2003-03-21 11:50
2003.07.10
Гистограмма