Seite 1 von 1

Tastenklick wird nicht akzeptiert, trotz processEvents()

Verfasst: 7. August 2010 00:57
von qtNiko
hallo,

ich habe in einem Simulationsprogramm, das in einer Schleife läuft, drei Tasten:
- Run kontinuierliche Schleifendurchläufe
- Step nach jedem Schleifendurchlauf auf nächsten step warten
- Stop Simulation beenden

Am Ende einer Schleife stehen zwei
QApplication::processEvents(),
damit Mouseklicks bearbeitet werden - so sollte es sein.

Nach Run kann ich jederzeit Step anklicken, und das Programm kann sofort mit Step schrittweise weitergeschaltet werden.
Auf Stop reagiert das Programm nur sporadisch :x
Um sicher zu stoppen, muss ich zuerst Step anklicken und dann wird Stop sofort akzeptiert, d.h. bearbeitet.

Die Signals aller drei Knöpfe sind mit dem Slot steuerAblauf(int buttNr) verbunden, wo die Reaktionen auf das Anklicken jeweils bearbeitet werden.

Wieviele Events werden mit einem QApplication::processEvents() eigentlich verarbeitet?
In einer Simulationsschleife treten eine Menge Events auf, weil diverse QLineEdits beschrieben und eine Grafik angezeigt wird. Dies funktioniert alles, nur die Reaktion auf die Stop-Taste nicht so recht.

Brauche ich evtl. noch mehr Statements mit QApplication::processEvents() hintereinander?

Ich kann bei Bedarf schon Code bereitstellen, aber nur ausschnittsweise, weil das ganze Programm viel zu groß ist.

Über Tips wäre ich sehr froh.

Verfasst: 7. August 2010 10:33
von solarix
1. Ich würde versuchen, einen solchen Loop zu vermeiden. Im GUI-Kontext wäre ein QTimer ganz gut geeignet. Oder ein Signal (QueuedConnection) am Ende der run-Methode, welches sich selbst (die run-Methode) triggert.

2. Ein Multithread-Kontzept wäre auch besser als ein GUI-Loop mit processEvents. Dann jedoch hätte die Software von Anfang an so entworfen werden müssen (Umbau von Singlethread auf Multithread kann ziemlich knifflig sein).

3. processEvents wird besser mit "hasPendingEvents ()" aufgerufen:

Code: Alles auswählen

  while (QCoreApplication::hasPendingEvents())
    QCoreApplication::processEvents();

Verfasst: 7. August 2010 11:57
von qtNiko
danke, das sind gute Tips
:)

Das mit hasPendingEvents () scheint am besten zur vorhandenen Struktur zu passen. Das probiere ich als erstes aus :D