![]() |
Exception in Synchronisierter Thread Routine nicht sichtbar
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. |
AW: Exception in Synchronisierter Thread Routine nicht sichtbar
Also nach diesem Link hier
![]() kann man mein Beispiel wie folgt umbauen, dann funktioniert es, da die Lösung im Thread stattfindet klappt das dann auch, aber der ExceptionEvent wird nicht aufgerufen -> der User bekommt die AV immer mit. In einer Anwendung die keine Exceptions Anzeigen darf bin ich also aufgeschmissen
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, Vcl.AppEvnts; Type TForm1 = Class(TForm) Button1: TButton; ApplicationEvents1: TApplicationEvents; Procedure Button1Click(Sender: TObject); Procedure ApplicationEvents1Exception(Sender: TObject; E: Exception); Private { Private-Deklarationen } Public { Public-Deklarationen } Procedure WillRaiseAnException(Sender: TObject); End; Var Form1: TForm1; Implementation {$R *.dfm} Type TTestThread = Class(TThread) Private FException: Exception; Procedure SyncCallEvent; Procedure HandleException; Procedure DoHandleException; Protected Procedure Execute; Override; Public OnDoSomeThing: TNotifyEvent; End; Procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); Begin showmessage('Catched an Exception : ' + E.Message); // Die Exception landet nicht hier, sondern wird direkt angezeigt -> man kann sie nicht "ungesehen" behandeln. 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.DoHandleException; Begin Application.ShowException(FException); End; Procedure TTestThread.Execute; Begin sleep(1000); Try Synchronize(SyncCallEvent); Except HandleException; End; 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.HandleException; Begin FException := Exception(ExceptObject); Try Synchronize(DoHandleException); Finally FException := Nil; End; End; Procedure TTestThread.SyncCallEvent; Begin If assigned(OnDoSomeThing) Then Begin OnDoSomeThing(self); End; End; End. |
AW: Exception in Synchronisierter Thread Routine nicht sichtbar [gelöst]
Sodale jetzt hab ichs raus ;)
Für alle die sich mim Selben Rumschlagen hier meine Lösung :
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, Vcl.AppEvnts; Type TForm1 = Class(TForm) Button1: TButton; ApplicationEvents1: TApplicationEvents; Procedure Button1Click(Sender: TObject); Procedure ApplicationEvents1Exception(Sender: TObject; E: Exception); Private { Private-Deklarationen } Public { Public-Deklarationen } Procedure WillRaiseAnException(Sender: TObject); End; Var Form1: TForm1; Implementation {$R *.dfm} Type TTestThread = Class(TThread) Private FException: Exception; Procedure SyncCallEvent; Procedure HandleException; Procedure DoHandleException; Protected Procedure Execute; Override; Public OnDoSomeThing: TNotifyEvent; End; Procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); Begin showmessage('Catched an Exception : ' + E.Message); 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.DoHandleException; Begin If assigned(Application.OnException) Then Begin Application.OnException(self, FException); End Else Begin Application.ShowException(FException); End; End; Procedure TTestThread.Execute; Begin sleep(1000); Try Synchronize(SyncCallEvent); Except HandleException; End; 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.HandleException; Begin FException := Exception(ExceptObject); Try Synchronize(DoHandleException); Finally FException := Nil; End; End; Procedure TTestThread.SyncCallEvent; Begin If assigned(OnDoSomeThing) Then Begin OnDoSomeThing(self); End; End; End. |
AW: Exception in Synchronisierter Thread Routine nicht sichtbar
Hallöle...:P
Zitat:
|
AW: Exception in Synchronisierter Thread Routine nicht sichtbar
ja ganz trivial ist das nicht,
und eigentlich müsste ich nach HandleException noch ein Exit einbauen, dann würde aber mein Thread nicht terminieren .. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz