Форум: "Основная";
Текущий архив: 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