Berechnung wenn nötig abbrechen
-
Ich habe ein Programm das einige Berechnungen ausführt. Diese Berechnungen können unter Umstanden etwas länger dauern.
Ich habe nicht so die Erfahrung jetzt ein zweiten Thread zu programmieren. Ausserdem muss der Anwender auf die berechneten Daten warten, kann also während der Bearbeitung nichts mit dem Programm anfangen. Trotzdem muss ich ihm die Möglichkeit geben die Berechnung abzubrechen.
Wo kann ich die Berechnung plazieren damit die Nachrichteschleife nicht hängenbleibt. Oder muss ich es doch über einen Thread realisieren (was ich ja nicht will).
danke cu
-
hass schrieb:
Oder muss ich es doch über einen Thread realisieren (was ich ja nicht will).
dieses wäre aber IMHO das sinnvollste
-
Du könntest aber auch innerhalb der Berechnung eine Abbruchbedingung einbauen.
-
Du könntest alle paar Berechnungsschritte mal die Nachrichtenschlange abbauen. (Mit PeekMessage usw.)
-
So schwierig sollte das aber mit Threads auch nicht sein

-
Sicherlich, das Problem ist nur, dass du dann in die Thread Schleife auch etwas einbauen musst, was auf einen Abbruch reagiert. Man kann natürlich auch mit TerminateThread hart killen, aber das sollte man möglichst vermeiden, da es unerwünschte Nebeneffekte geben kann.
Einen extra Thread zu machen ergibt nur Sinn, wenn es eine Hintergrundberechnung ist und der User weiterhin mit der Oberfläche arbeiten kann. Da dies bei hass aber nicht der Fall ist, reicht der Hauptthread vollkommen aus. Man muss nur, wie SeriousSam schon sagte, von Zeit zu Zeit die Message Queue abarbeiten.
-
groovemaster schrieb:
[...] von Zeit zu Zeit die Message Queue abarbeiten.
Wodurch der User wieder mit der Oberfläche arbeiten kann. Ich würde auch einen Thread verwenden (es sei denn das System soll nicht belastet werden), denn dafür sind sie da.
-
Und wie bau ich das in die Funktion ein?
void BerechneWas() { while(So_Lanage_Berechnung_Läuft) { // WAS SOLL JETZT HIERT REIN .... } }Ich habe versucht GetMessage() und co. da reinzubauen. Aber das Programm wird sofort beendet, das heisst man sieht das Fenster nicht mehr, aber es läuft noch im TaskManager.
-
D@niel $chumann schrieb:
groovemaster schrieb:
[...] von Zeit zu Zeit die Message Queue abarbeiten.
Wodurch der User wieder mit der Oberfläche arbeiten kann.
Und? Siehst du darin ein Problem?
Ein modales Statusfenster mit Abbruch-Button, und du hast alles was du brauchst.@hass
Du hast letztendlich 2 Möglichkeiten
1.
Du baust GetMessage/TranslateMessage in die Berechnungsfunktion ein und sorgst dafür, dass GetMessage/TranslateMessage zyklisch aufgerufen werden.
2.
Du baust die Berechnungsfunktion in den Message Loop ein und arbeitest dann mit PeekMessage. Praktisch ähnlich wie man es normalerweise bei Spielen macht. In diesem Fall wird die Berechnungsfunktion zyklisch aufgerufen und du musst die interne Verwaltung entsprechend darauf abstimmen. Sofern keine Berechnung und keine Nachrichten anstehen übergibst du dann die Kontrolle dem System
WaitMessage.
Ich persönlich würde Variante 2 vorziehen, da du damit systemunabhängig bist und sowas dann leicht auf andere Systeme portiert werden kann.
-
Du baust GetMessage/TranslateMessage in die Berechnungsfunktion ein und sorgst dafür, dass GetMessage/TranslateMessage zyklisch aufgerufen werden.
Nein, PeekMessage.
-
"GetMessage/TranslateMessage" diente ja mehr oder weniger auch nur als Platzhalter. Da die Verarbeitung non-blocking sein soll, schliesst das die Verwendung von GetMessage richtigerweise aus.