Главная страница
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.017 c
6-31378
LOX
2003-05-05 13:58
2003.07.10
А как вызвать почтового клиента?


3-31090
abc
2003-06-16 12:45
2003.07.10
почему не работает Locate в TADOQuery?? может кто сталкивался?


3-31107
Роман Лицевич
2003-06-13 12:21
2003.07.10
Доступ к таблице в InterBase


14-31397
RIMMER
2003-06-23 00:58
2003.07.10
Куда уходят ветки?


7-31535
Holy
2003-04-25 10:16
2003.07.10
Сетевой принтер