Seite 1 von 1

in ein laufendes Programm eingreifen

Verfasst: 7. Oktober 2007 15:18
von qtprogram
Hi,

ich habe wieder mal eine Frage:
in meinem Programm habe ich eine while - schleife eingebaut, das mir bestimmte Werte berechnet und auf der Konsole ausgibt. Jetzt möchte ich aber einen weiteren PushButton einfügen, der diese Ausgabe unterbricht. Das ghet ja theoretisch auch (mit Signal/Slot), aber ich kann während mein programm rechnet und fleißig ausgibt den Pause-Button nicht betätigen.
Ist die einzige Möglichkeit diesen Slot zu aktivieren, bzw den Pausebutton drücken zu können über QDialog (nichtmodal)? Oder gibt es da noch eine andere Möglichkeit?

Danke

qtprog

Verfasst: 7. Oktober 2007 15:34
von Volker
Selbst wenn Du einen nicht modalen Dialog machst wirst du während der Ausführung deiner while Schleife nicht auf die Benutzeroberfläche zugreifen können. Zu mindest nicht solange die Berechnung im gleichen Thread abläuft wie die GUI.
Die einzige Möglichkeit so etwas zu realisieren ohne einen eigenen Thread für die Berechnung zu starten, düfte der Aufruf von qApp->processEvents() innerhalb der while Schleife sein. Siehe dazu auch QProgressDialog.

Verfasst: 7. Oktober 2007 16:40
von CaptnChaos
mach deine berechnungen in einem Thread und unterbrich ihn mit dem button. das sollte kein problem sein.
wenn du nicht weisst wie das geht, kann ich dir gerne wieder helfen :)

Verfasst: 7. Oktober 2007 17:00
von marcb
Voll simpel: Alle paar Iterationen folgender Aufruf:

QApplication::processEvents();

Verfasst: 7. Oktober 2007 17:18
von mollitz
kannst auch nen qtimer machen und den alle paar millisekunden ne neue berechnung starten lassen

Verfasst: 7. Oktober 2007 19:56
von qtprogram
wenn ich das ganze mit dem timer mach, kann ich dann meinen PushButton betätigen, der das ganze dann stoppt/ unterbricht? ich müsste nämlich sowas wie nen "Pause-button " und einen "Stop-Button" einbauen..

Danke

Verfasst: 7. Oktober 2007 21:38
von Volker
So wie du das beschreibst klingt es, als ob das Beispiel zu QProgressDialog genau das macht, was Du suchst. Also würde ich mir das anschauen:

http://doc.trolltech.com/4.3/qprogressdialog.html

Verfasst: 7. Oktober 2007 22:09
von CaptnChaos
leute! trotzdem muss das in einen thread rein!
wenn man eine unendliche while schleife im gui thread macht, friert die gui ein, da kann man sich auf den kopf stellen und lachen, das bringt trotzdem nix.

Verfasst: 7. Oktober 2007 22:12
von Volker
Warum sollte die GUI einfrieren, wenn die Events über processEvents abgearbeitet werden? Dann würde ja der QProgressDialog kein Sinn machen.

edit: Das Ding heist QProgressDialog nicht QProcessDialog,... immer wieder schreib ich's falsch :-)

Verfasst: 7. Oktober 2007 22:23
von CaptnChaos
Versuchs bitte mal....
wirklich effektiv is das net wirste sehen....
warum meinst du denn lässt der pushButton sich net klicken? dahinter stehen auch events... (naja net ganz aber....)
oder warum wird das fenster in dem der gui ist weiss? paintEvent ist auch en event....

Verfasst: 7. Oktober 2007 22:28
von Volker
Hab ich schon funktioniert wunderbar. Man sollte nur keine Sachen in der while Loop machen, die irgendwelche Signale auslösen die mit Slots verbunden sind, das führt dann recht schnell zu inkonsistenten Zuständen. Aber das hängt dann eher vom jeweiligen Programm ab.

Außerdem sollte der Rechenaufwand für eine Iteration klein sein, da logischerweise während der Ausführung der GUI Thread weiterhin blockiert. Wenn das was es zu Berechnen gibt für eine Iteration lange dauert, dann sollte man in der Tat auf einen Thread ausweichen. Aber für simple Sachen reicht processEvents allemal.

Verfasst: 7. Oktober 2007 22:46
von CaptnChaos
wir reden über eine unendliche schleife, nicht über eine endliche... der event wird erst nach beenden der schleife ausgelöst...
bei µCs kann man das mit interrupts machen, aber events sind nicht das gleiche...

Verfasst: 7. Oktober 2007 22:48
von Volker
wenn du innerhalb dieser unendlichen Schleife processEvents aufrufst spielt das keine Rolle. Die Qt Eventloop ist auch eine unendliche Schleife

Verfasst: 7. Oktober 2007 22:50
von CaptnChaos
achso! du rufst sie auf! na dann!

Verfasst: 7. Oktober 2007 22:57
von Volker
Mir ist gerade aufgefallen, in der Doku seit Qt 4.3 ist bei QProgressDialog kein explizer Aufruf von qApp->processEvents mehr enthalten. Ohne in den Source Code geschaut zu haben nehme ich an, die haben den Aufruf in die setValue Methode des QProgressDialogs gepackt. In Qt 4.2 musste man das noch selbst aufrufen.