000
04.10.2008, 21:30 Uhr
FunnyDingo
|
Vor einiger Zeit habe ich dazu schon einmal nachgefragt.
Ich wollte mich des Themas nun endlich annehmen, habe nur eine sehr "unschöne" Lösung. Vorab ein paar Infos:
Es geht hier nur um "FatalExceptions", die wirklich eine Beendingung der Anwendung erfordern. Im Konstruktor des Moduls werden x Threads erstellt. Bereits im Konstuktor kann eine Exception auftauchen (Thread konnte nicht erstellt werden). Der Hauptprozess ist mit anderen Aufgaben beschäftigt. Der kann also nicht warten. Es gibt einen Controller, der Pointer zu allen Modul-Objekten besitzt.
Nun zu meiner Idee: - Der Exception-Handler des Moduls setzt eine Status-Variable, die angibt ob der Thread läuft, auf false - Die Exception wird in eine Member-Variable der Klasse kopiert - raise(17)
- Signal-Handler im Hauptprozess erkennt das Signal - Controller::checkModuls() iteriert durch alle Module und ruft jedweils - modul->checkThreads() auf (den nur das Modul weiß genau wie viele Threads laufen)
- checkThreads prüft alle Status-Variablen seiner Threads - Steht eine auf false wird eine Exception mit den Daten der "zwischen gespeicherten" Exception ausgelöst
Da checkThreads() ja im Kontext des Hauptprozesses ausgeführt wird, dürfte die Exception im Handler des Hauptprozess verarbeitet und die Anwendung somit beendet werden.
Funktionieren sollte das (oder hab ich was übersehen?) aber effektiv finde ich das nicht. -- "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)
Meine Website: http://www.funnydingo.de Dieser Post wurde am 04.10.2008 um 21:36 Uhr von FunnyDingo editiert. |