2009-12-10 8 views
7

Qual è il modo corretto per il thread principale della GUI di aggiornare un QProgressDialog durante l'attesa di un QFuture. In particolare, ciò che accade in questo ciclo:Aggiornamento di QProgressDialog con un QFuture

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

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

    // what goes here? 
} 

In questo momento ho un sonno() come chiamata di lì, ma che non è ottimale (e naturalmente introduce una certa latenza GUI).

Se non inserisco nulla, il thread principale eseguirà il loop-pole pd.setValue(), sprecando i cicli della CPU.

Speravo di inserire qualcosa come QCoreApplication :: processEvents (flags, maxtime), ma che restituisce immediatamente se la coda degli eventi è vuota. Mi piacerebbe una versione che aspetta fino a maxtime o qualsiasi altra cosa anche se la coda è vuota. In questo modo, ottengo il mio ritardo e il thread principale è sempre pronto a rispondere agli eventi della GUI.

risposta

14

Utilizzare un QFutureWatcher per monitorare l'oggetto QFuture utilizzando segnali e slot.

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

Grande risposta TimW. Per tua informazione ti manca un '&' davanti a 'watcher' in' connect (watcher, ...); '? – sstock

+0

thx, risolto il codice – TimW