Seite 1 von 1

LCDNumber aus Schleife heraus refreshen

Verfasst: 5. Mai 2009 08:48
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 ~~~

Verfasst: 5. Mai 2009 08:52
von franzf

Verfasst: 5. Mai 2009 09:06
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.

Verfasst: 5. Mai 2009 09:22
von Tinitus
warum?

Verfasst: 5. Mai 2009 09:27
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)

Verfasst: 5. Mai 2009 09:33
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?

Verfasst: 5. Mai 2009 09:35
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.