Eigene Componente mit OnError-Ereignis (Thread safe)



  • Hallo,

    habe eine einfache Ableitung von TComponent gemacht (TErrorHandledComponent genannt) mit der einzigen neuen Eigenschaft ErrorHandler. Der Errorhandler ist eine nichtvisuelle eigene Komponente die einen Error-Stack bereithält und darin Fehler speichert. Diese Error-Komponente wird aufs Forumlar gezogen, alle von TErrorHandledComponent abgeleiteten Klassen verknüpfen sich mit dem Errorhandler, damit sie eine globale Sammelstelle für Fehler benutzen.

    Der Errorhandler hat ein OnError-Ereignis, womit dann der eigentlichen Anwendung der Fehler mitgteilt werden soll. In der OnError, implementiert im Hauptformular, wird ein Panel gezeigt, mit einer Fehlerbeschreibung. Also ein Zugriff auf VCL-Komponenten.

    Die Klasse TErrorHandledComponent wird als Basisklasse für weitere Komponenten werwendet. Im Endeffekt bauen alle Klassen darauf auf, nur um die Fehlerbehandlung zu erben.

    Diese Klassen haben eine eigene Routine zur Fehlerbehandlung die weitergereicht wird in den ErrorHandler. Diese Routine wird als OnTimer-Ereignis in einem Timer verwendet -> funktioniert.

    Nun habe ich in dieser Klasse die Option eine andere High-Res Timer Komponente zu verwenden, die auf einem Thread basiert, oder gleich einen eigenen Thread verwendet. Die rufen ebenfalls die für OnTimer genutzte Routine auf. Jedoch hängt dann die Applikation vermutlich durch den Zugriff auf VCL-Komponenten aus dem Thread heraus. Ich kann auch nicht den Thread der High-Res Timer-Kompo. ändern. Eine TCriticalSection vor dem betreten der OnTimer-Routine bringt auch nix.

    Wie kann ich es machen, dass die Threads das OnError benutzen, ohne das sich das Programm aufhängt? Oder kann ich generell kein OnError-Ereignis zur Signalisierung verwenden?

    Beste Grüße



  • int02h schrieb:

    Wie kann ich es machen, dass die Threads das OnError benutzen, ohne das sich das Programm aufhängt?

    Du könntest TThread::Synchronize() (blockierend) oder TThread::Queue() (asynchron) benutzen.

    Mit welcher C++Builder-Version arbeitest du denn?



  • Benutzen tue ich BCB6. Leider kann ich kein Synchronize() für die benutze High-Res Timer Komponente verwenden. Im eigenen Thread wäre es mit Paar Modifikationen theoretisch möglich.

    Oder kann ich irgendwie fremde Threads synchronisieren? Hab selbst kaum Erfahrungen mit Threads.



  • Also dem High-Res Timer weise ich auch nur die OnTimer-Funktion "myDoOnTimer()" zu...In der wird dann zum Schluß das OnError() aufgerufen.



  • int02h schrieb:

    Benutzen tue ich BCB6.

    Dann wirds etwas schwierig. Damals gab es TThread::Queue(), glaube ich, noch gar nicht, und Synchronize() geht ohne Thread meines Wissens erst seit C++Builder 2007 => Handarbeit oder Upgrade.


Log in to reply