[gelöst] Einsatz von QTimer in einer Schleife

Alles rund um die Programmierung mit Qt
Antworten
CarstenH
Beiträge: 5
Registriert: 30. August 2010 10:13

[gelöst] Einsatz von QTimer in einer Schleife

Beitrag von CarstenH »

Hallo,
ich habe eine Frage zur logischen Anwendung von QTimer. Grundsätzlich habe ich die Funktionsweise schon verstanden, habe aber gerade ein Problem wie ich einen QTimer logisch in meiner Aufgabe einsetze (den code bekomm' ich wohl nacher schon hin...;-)).

Hier die Idee des Programms: Der Anwender bekommt eine bestimmte Anzahl von Fragen, für die er jeweils eine bestimmte Zeit zur Verfügung hat. Diese Zeit pro Aufgabe soll in einem Countdown (LCDNumber) herunter gezählt werden.
Hier der entsprechende Abschnitt aus dem Programm (ich hab's etwas vereinfacht, also nicht daran stören, dass es nicht korrekte C++ oder QT Syntax ist):

void MainWindow::startTest()
{
for (int i=1; i < maxaufgaben;i++) {
aufgabe();
update();
}
}

void MainWindow::update()
{
if (restzeit > 0) {
QTimer::singleShot(1000, this, SLOT(update()));
restzeit = restzeit -1;
LCDDisplay->display(restzeit);
}
}

Mein Problem ist nun, dass die Prozedur startTest() nach dem Aufruf von update(), weiter läuft und immer neue Aufgaben erstellt und neue Timer startet. Aber eigentlich soll mit der Erstellung einer neuen Aufgabe gewartet werden, bis der Timer abgelaufen ist.

Ich vermute mal, dass die Lösung völlig trivial ist, aber ich komme echt nicht darauf.

Danke im Voraus!!

Gruß, Carsten
Zuletzt geändert von CarstenH am 8. September 2010 22:50, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Eine Schleife ist da sowieso nichts. Denn eine Schleife blockiert, und das passt nicht zu GUI und Event-Handling :P
Speicher dir in deiner Klasse
*) size_t maxAnzahlAufgaben
*) size_t aktuelleAufgabe
Und statt QTimer::singleShot() verwendest du auch noch ein festes QTimer-Objekt, das du mit einem festen timeout laufen lässt. (Alternativ: timerEvent() verwenden, sieh Doku).
Wenn der Timer gefeuert hat, kannst du dein LCD-Display aktualisieren. Ist die Zeit für die Aufgabe abgelaufen (mitzählen), musst du im passenden SLOT/timerEvent() einfach aktuelleAufgabe hochzählen und die neue Aufgabe anzeigen.

Außerdem: bitte keine QWidget-Derivat-Methode "update" nennen. QWidget::update() gibt es schon. Am Ende kann das dumm enden, den Fehler zu finden wird nicht leicht ;)
CarstenH
Beiträge: 5
Registriert: 30. August 2010 10:13

Beitrag von CarstenH »

Klasse, der Tipp, nicht dir for-Schleife zu nutzen, war genau der, den ich brauchte!!!
Auch wenn der Code immernoch wie Kraut und Rüben aussieht, funktioniert er doch wie gewünscht...;-))


Danke!!!
Antworten