Servus,
ich habe mir eine TTHread Komponente Gebastelt, diese ruft via Synchronize eine Routine auf und in dieser Routine werfe ich eine
Exception, warum kann ich diese
Exception nicht im Hauptthread sehen, wo ich doch in dessen Rechenzeit laufe ?
Wie kann ich das Richtig schreiben, im Code von WillRaiseAnException weis ich unter Umständen gar nicht, das mich gerade ein TTHread aufgerufen hat ..
Zur Verdeutlichung der Untenstehende Beispielcode :
Delphi-Quellcode:
Unit Unit1;
Interface
Uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls;
Type
TForm1 =
Class(TForm)
Button1: TButton;
Procedure Button1Click(Sender: TObject);
Private
{ Private-Deklarationen }
Public
{ Public-Deklarationen }
Procedure WillRaiseAnException(Sender: TObject);
End;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
Type
TTestThread =
Class(TThread)
Private
Procedure SyncCallEvent;
Protected
Procedure Execute;
Override;
Public
OnDoSomeThing: TNotifyEvent;
End;
Procedure TForm1.Button1Click(Sender: TObject);
Var
t: TTestThread;
Begin
t := TTestThread.Create(true);
t.FreeOnTerminate := false;
t.OnDoSomeThing := WillRaiseAnException;
t.Start;
// Warten bis Thread Fertig ist.
While Not t.Terminated
Do Begin
sleep(1);
Application.HandleMessage;
End;
t.Free;
showmessage('
Finished.');
End;
{ TTestThread }
Procedure TTestThread.Execute;
Begin
sleep(1000);
Synchronize(SyncCallEvent);
sleep(1000);
Terminate;
End;
Procedure TForm1.WillRaiseAnException(Sender: TObject);
Begin
caption := '
Hallo';
// Raise Exception.Create('Siehst du mich ?'); // -- Das hier funktioniert nicht, warum ?
// showmessage('Hallo'); -- Ist erlaubt und Funktioniert, da WillRaiseAnException im Context des Hauptthreads läuft
caption := '
Hallo du';
End;
Procedure TTestThread.SyncCallEvent;
Begin
If assigned(OnDoSomeThing)
Then Begin
OnDoSomeThing(self);
End;
End;
End.