2009-12-10 4 views
7

Quelle est la méthode appropriée pour que le thread principal de l'interface graphique mette à jour un QProgressDialog en attendant un QFuture. Plus précisément, ce qui se passe dans cette boucle:Mise à jour d'un QProgressDialog avec un QFuture

QProgressDialog pd(...); 
QFuture f = ...; 

while (!f.isFinished()) { 
    pd.setValue(f.progressValue()); 

    // what goes here? 
} 

En ce moment, j'ai un sommeil() comme appel là-bas, mais ce n'est pas optimale (et bien sûr une certaine latence introduit GUI).

Si je ne mets rien, le thread principal sera pd.setValue(), ce qui gaspillera des cycles CPU.

J'espérais mettre quelque chose comme QCoreApplication :: processEvents (flags, maxtime), mais cela revient immédiatement si la file d'attente d'événements est vide. Je voudrais une version qui attend jusqu'à maxtime ou quoi que ce soit même si la file d'attente est vide. De cette façon, je reçois mon retard et le thread principal est toujours prêt à répondre aux événements GUI.

Répondre

14

Utilisez un QFutureWatcher pour surveiller l'objet QFuture à l'aide de signaux et d'emplacements.

QFutureWatcher watcher; 
QProgressDialog pd(...); 
connect(&watcher, SIGNAL(progressValueChanged(int)), &pd, SLOT(setValue(int))); 
QFuture f = ... 
watcher.setFuture(f); 
+0

Grande réponse TimW. FYI vous manque un '&' devant 'watcher' dans' connect (observateur, ...); '? – sstock

+0

thx, fixé le code – TimW