While-Schleife nach bestimmter Zeit abbrechen
-
Hallo liebes Forum,
ich habe ein großes Problem.
Ich habe eine while-Schleife in der immer wieder die Funktion runSimulation() aufgerufen wird. Diese Funktion braucht manchmal leider bis zu 7 Sekunden. Ich habe aber leider meistens nur 5 Sekunden zur Verfügung. So lange soll natürlich die while-Schleife laufen, aber sie bricht zu spät ab, da runSimulation() zu lange braucht.
ich habe natürlich den Fehler weiterverfolgt und bin zu dem Entschluss gekommen, dass ein Aufruf von Eclipse-Prolog (http://eclipseclp.org/) so lange braucht. Da ich leider nicht in Eclipse-Prolog rumhantieren kann, versuche ich nun irgendwie die Schleife abzubrechen.
Nun zu meiner Frage: Weiß jemand, wie ich das schaffen kann? Also wie ich die Schleife nach einer bestimmten Zeit abbrechen kann und das sogar innerhalb der Schleife.
Liebe Grüße,
Eldastoker
-
Nicht ohne weiteres mit nur einem Thread.
Möglichkeiten die ich sehe:- schau, ob du der Funktion mit dem Seitenaufruf einen timeout mitgeben kannst
- falls nicht, überleg ob du ein anderes Framework/Bibliothek bemühen kannst, wo es so eine Möglichkeit gibt (z.B. boost::asio müsste das können)
- Starte den Schleifeninhalt im neuen Thread und schick dem zur Not einen Interrupt oder was angenehmeres - zumindest kannst du dann währenddessen weiterarbeiten.
-
Wenn ich dich richtig verstehe, rufst Du in deiner While-Schleife mehrmals eine "externe" nicht von Dir beeinflussbare Funktion auf. Wenn diese "externe" Funktion eine zuverlässige Laufzeit (z.B. 2 Sekunden) hat, kannst Du die Schleife nach dem 2. Durchlauf mit "break" abbrechen.
Sollte das Laufzeitverhalten beliebig sein, solltest du einen Thread bauen, welcher die "externe" Funktion solange aufruft, bis der Hauptthread signalisiert, dass das aufrufen der "externe" Funktion abgebrochen werden kann. Der Hauptthread muss so etwas wie einen Timer setzen und diesen mit Aufruf des Threads (welcher die "externe" Funktion aufruft) starten. Wenn die festgelegte Zeit abgelaufen ist, wird dem laufenden Thread signalisiert, dass er mit dem aufrufen der "externe" Funktion aufhören soll. Ggf. beendest Du den Thread.
-
Danke schonmal für die Antworten.
Den weiteren Aufruf der externen Funktion abzubrechen bringt nichts, aber die Idee mit dem Thread finde ich gut ...
Da ich vollkommen neu in C++ bin und mich mit Threads überhaupt nicht auskenne, hab ich mir natürlich schon ein paar Tutorials durchgelesen, aber irgendwie hab ich noch nicht recht verstanden, wie ich nun einen Thread bauen kann, der meine While-Schleife aufruft und wie ich den nach 4 Sekunden abschieße ...
Könnte mir das jemand erklären? Arbeite unter Linux und habe eine Klasse, in welcher die While-Schleife aufgerufen wird ... Desweiteren noch ein Makefile, welches alles zusammenpackt und mir eine Datei gibt, die ich startet kann ...
-
Hallo Eldastoker,
ich möchte Dich wirklich nicht demotivieren; aber ich glaube dass Du in Deinem jetzigen Wissensstatus (vollkommen neu in C++) damit (thread etc.) überfordert wärst.
Das mal so schnell erklären, ist nicht so einfach. Entweder Du baust dir etwas selbst; z.B. mit POSIX Threads oder Du nutzt eine fertige Bibliothek wie z.B. Boost oder Qt.
Gruß
-
Nur weil ich in C++ neu bin, heißt das nicht, dass ich das nicht schnell lernen kann
...
Danke für den Tipp mit Boost und POSIX ... Schaue mir die Dinger mal an und gucke, ob ich einen Thread nach X Sekunden irgendwie killen kann ...
-
Einen Thread einfach zu killen ist meistens keine gute Idee. Es sei denn, deine Daten befinden sich jederzeit in einem gültigen Zustand.
-
Ich bin mir nicht zu 100% sicher, ob die Daten immer sicher sind, aber ich sehe im Moment keine andere Möglichkeit mehr, als das mit Thread killen zu testen, da wir zwar nebenbei daran arbeiten SWI-Prolog anstatt Eclipse zu verwenden, aber ich mich darauf nicht verlassen möchte ...
Naja ich glaub ich warte mal ab, bis wir SWI-Prolog benutzen.