LCDNumber aus Schleife heraus refreshen

Alles rund um die Programmierung mit Qt
Antworten
Tinitus
Beiträge: 3
Registriert: 4. Mai 2009 14:44
Wohnort: Saarland

LCDNumber aus Schleife heraus refreshen

Beitrag von Tinitus »

Hallo Leute,

ich bin sozusagen "bloody beginner" mit Qt und habe folgendes Problem:

Ich möchte mit Hilfe der QLCDNumber Klasse einen Zähler anzeigen, den ich in einer Schleife hochzählen:

[code]
for(i=0; i<5; i++){
clock_t endwait;
endwait = clock () + ticktime * CLOCKS_PER_SEC;
while (clock() < endwait) { }
LCDCounter->display(i);
}
[/code]

Leider zeigt der LCDCounter (=Objekt der QLCDNumber Klasse) nur den Endwert von i (hier: 4) an, nicht aber die Zwischenwerte.

Wie schaffe ich es, dass der Counter jeden Wert von i anzeigt?
Scheinbar reagiert das Objekt nicht auf die Anweisung "LCDCounter->display(i)".

Danke für eure Hilfe!
~~~ Tinitus ~~~
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

 while (clock() < endwait) { } 
Bitte unterlass solche Konstruktionen in jederProgrammiersprache/Programmbibliothek, wenn du die Möglichkeit hast auf wait() oder noch besser Timer zurückzugreifen.
Tinitus
Beiträge: 3
Registriert: 4. Mai 2009 14:44
Wohnort: Saarland

Beitrag von Tinitus »

warum?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

* kein Eventhandling
* daher (falls der Code im Mainthread ist) kein GUI-Update mehr
* der Vorgang kann nur schlecht abgebrochen werden
* ein CPU-Core wird komplett belegt (=50% CPU-Last bei einem heutigen Dual-Core, 100% Rechnerlast bei einem älteren System)
* Alternativen sind einfach zu implementieren (anstatt "Polling" mit Events arbeiten)
Zuletzt geändert von solarix am 5. Mai 2009 09:51, insgesamt 1-mal geändert.
Tinitus
Beiträge: 3
Registriert: 4. Mai 2009 14:44
Wohnort: Saarland

Beitrag von Tinitus »

OK, danke.
Aber was ist mit meinem eigentlichen Problem?
Der o.g. Link hilft mir nicht wirklich weiter...

In Adobe Flex / Action Script gibt es für solche Fälle das Enter Frame Event.
Gibt es bei Qt (bin wie gesagt noch Frischling...) was vergleichbares?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dein Konstrukt blockiert einfach die EventLoop. So lange du in deiner Funktion rumrödelst, so lange kann nicht in die EventLoop gesprungen werden und die Events abgearbeitet werden. Somit auch kein Neuzeichnen.

Außerdem ist dein clock() < endwait ist eine Art wait(), welches ticktime * CLOCKS_PER_SEC lange wartet.

Du kannst es ja jetzt mal versuchen, mit QApplication::processEvents() in der Schleife jedesmal deine Events abzuarbeiten. Aber das finde ich immer noch nicht sooo schön. Alle paar Microsekunden in die EventLoop springen... Aber naja.

Besser wäre, wenn du einen Timer verwendest, und dir in definierten Intervallen ein Signal senden lässt und dieses verarbeitest.
Antworten