Главная страница
    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.48 MB
Время: 0.009 c
14-31494
Nox
2003-06-23 02:07
2003.07.10
День программиста


1-31240
Andrey02
2003-06-28 19:39
2003.07.10
Thread поток - метод Synchronize. Качество программы.


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


1-31185
mur
2003-06-26 11:27
2003.07.10
Как определить путь к файлам проекта в Design-time?


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





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