Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Exception aus Thread

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.10.2008, 05:55 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich das richtig verstehe, würde ich das ganze andersherum angehen, d.h., event statt polling. Konkret bedeutet das, dass jedes Modul einen Verweis auf den Controller enthält und ihm ggf. mitteilt, dass ein fataler Fehler aufgetreten ist. Der Controller kann dann den anderen Threads mitteilen, dass sie sich kontrolliert zu beenden haben und die Anwendung beenden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.10.2008, 16:30 Uhr
FunnyDingo



Aber wenn ich das Modul controller::handleException() ausführen lasse, wird diese Funktion ja im Kontext des Threads ausgeführt. Wie soll ich denn von dort aus die Anwendung beenden?

Vielleicht als Hinweis: der Hauptthread (sorry, habe gestern fälschlich den Begriff Hauptprozess verwendet) versucht aus meiner ipcQueue Daten zu lesen und wird durch die Semaphore dort geblockt.

C++:
while(runLoop)
    {
        connection *con;
        workerQueue->read(&con);
        // ...
    }

--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.10.2008, 18:23 Uhr
0xdeadbeef
Gott
(Operator)


Um...ich hätte jetzt erwartet, dass der Hauptthread die Kontrolle über die anderen Threads ausübt (was ihn zum Hauptthread machte). Gib dem Controller doch einen eigenen Thread (den Hauptthread, weil er alles andere kontrolliert...) und lass ihn auf einer message queue horchen, in die die anderen Threads bei Problemen reinschreiben können. Auf POSIX-Systemen bietet sich dafür msgget etc. an, unter Windows gibt es mit Sicherheit etwas Äquivalentes.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.10.2008, 20:01 Uhr
FunnyDingo



Die Threads laufen derzeit quasi unkontrolliert. Ich starte sie und überlasse sie dann ihrem Schicksal. Das ist wohl das größte Problem. Dein Vorschlag klingt gut. msgget kannte ich bisher nicht - werde ich mir dann mal ansehen.

Danke
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: