AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Exception in Synchronisierter Thread Routine nicht sichtbar

Exception in Synchronisierter Thread Routine nicht sichtbar

Ein Thema von Corpsman · begonnen am 15. Dez 2016 · letzter Beitrag vom 15. Dez 2016
Antwort Antwort
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, 09: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 09:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

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

AW: Exception in Synchronisierter Thread Routine nicht sichtbar

  Alt 15. Dez 2016, 09:57
Also nach diesem Link hier http://stackoverflow.com/questions/5...xecute/5443958

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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

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

AW: Exception in Synchronisierter Thread Routine nicht sichtbar [gelöst]

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

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: Exception in Synchronisierter Thread Routine nicht sichtbar

  Alt 15. Dez 2016, 10:15
Hallöle...
Zitat:
Sodale jetzt hab ichs raus
Wie immer... schon redet man drüber, dann kommt man selbst auf die Lösung. Willkommen im Club.
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

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

AW: Exception in Synchronisierter Thread Routine nicht sichtbar

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

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz