In Arbeitsintesiver Schleife Events abfragen

Alles rund um die Programmierung mit Qt
Antworten
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

In Arbeitsintesiver Schleife Events abfragen

Beitrag von pospiech »

Ich habe einen Prozess, der Abfragt ob ein Gerät eine Position erreicht hat (While Schleife). Das führt wie gewollt dazu das der Code erst dann weiter ausgeführt wird wenn das Gerät angekommen ist. Hat aber den Nachteil das die Applikation blockiert ist. Jetzt würde es mir ausreichen wenn zwischendurch die Events abgefragt würden.

Ein extra Thread wäre hier keine Lösung, weil ich damit genau nicht verhindert würde das der darauffolgende Code ausgeführt wird.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Hilft die
void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static]
weiter?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Naja und was passiert wenn das Gerät die position nicht erreicht???

Aber mach doch einfach zu beginn/Ende nen

Code: Alles auswählen

QApplication::processEvents()
allerdings wäre es sinnvoller nen Signal auszulösen wenn das Gerät die Position hat bzw das in nen Thread laufen zu lassen. Eine blockierende while schleife ohne abbruchbedingung is ne riesen gefahr!

Ein extra Thread wäre hier keine Lösung, weil ich damit genau nicht verhindert würde das der darauffolgende Code ausgeführt wird.
Doch: Wenn der Thread nen Callback hätte und erst dann der Code ausgeführt werden würde!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ich habe einen Prozess, der Abfragt ob ein Gerät eine Position erreicht hat (While Schleife).
Polling

2 generelle moeglichkeiten, das auf ne eventschnittstelle zu mappen.

mit threads, wie AuE beschrieben hat. hat den Vorteil du kannst die prio des threades unabhaengig von dem der App / GUI thread bestimmen. das beschert dir nen kleinwenig dynamischeres verhalten wenn "viel" prozessorlast erzeugst, also das pollingintervall kann sich bei last ausserhalb vergroessern, ohne das deine gui gleich mit traege wird.

mit pseudothreading.
ne einfache whileschleife die mit processEvents() den focus abtreten laesst, is suboptimal. ganz einfach, weil damit nen Prozessorkern vollast rammeln laesst !
sleeps zur entlastung machen deine GUI zaeh ... weil klar, damit deine events von der gui auch verzoegerst.
besser die boerdmittel(windows) aka Timer nutzen ...
meist brauchst eh nur nen groesseres pollinterval ...
einfach nen timer aufziehen, und in der timer methode die posi abfragen. wenn die stimmt, event fueren -> weiteren code ausfuehren ...

Ciao ...
Antworten