in ein laufendes Programm eingreifen

Alles rund um die Programmierung mit Qt
Antworten
qtprogram
Beiträge: 12
Registriert: 3. Oktober 2007 13:27

in ein laufendes Programm eingreifen

Beitrag 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
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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.
Zuletzt geändert von Volker am 7. Oktober 2007 21:38, insgesamt 1-mal geändert.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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 :)
marcb
Beiträge: 19
Registriert: 29. Juni 2005 10:24

Beitrag von marcb »

Voll simpel: Alle paar Iterationen folgender Aufruf:

QApplication::processEvents();
mollitz
Beiträge: 81
Registriert: 5. April 2007 10:55

Beitrag von mollitz »

kannst auch nen qtimer machen und den alle paar millisekunden ne neue berechnung starten lassen
qtprogram
Beiträge: 12
Registriert: 3. Oktober 2007 13:27

Beitrag 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
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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 :-)
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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....
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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...
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

wenn du innerhalb dieser unendlichen Schleife processEvents aufrufst spielt das keine Rolle. Die Qt Eventloop ist auch eine unendliche Schleife
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

achso! du rufst sie auf! na dann!
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Antworten