Einzelnen Beitrag anzeigen

Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#1

Exception in Synchronisierter Thread Routine nicht sichtbar

  Alt 15. Dez 2016, 08:44
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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01

Geändert von Corpsman (15. Dez 2016 um 08:47 Uhr)
  Mit Zitat antworten Zitat