2009-12-10 5 views
7

¿Cuál es la forma correcta para que el subproceso principal de la GUI actualice un QProgressDialog mientras se espera un QFuture? En concreto, lo que sucede en este bucle:Actualizar un QProgressDialog con QFuture

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

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

    // what goes here? 
} 

Ahora mismo tengo un sueño() como la llamada allí, pero eso no es óptima (y por supuesto introduce cierta latencia GUI).

Si no pongo nada, el hilo principal hará un loop-pole pd.setValue(), desperdiciando ciclos de CPU.

Tenía la esperanza de poner algo así como QCoreApplication :: processEvents (flags, maxtime), pero eso retorna inmediatamente si la cola de eventos está vacía. Me gustaría una versión que espere hasta el momento del tiempo o lo que sea, incluso si la cola está vacía. De esta forma, recibo mi retraso y el hilo principal siempre está listo para responder a los eventos de GUI.

Respuesta

14

Utilice un QFutureWatcher para controlar el objeto QFuture utilizando señales y ranuras.

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

Gran respuesta TimW. FYI ¿te falta un '&' delante de 'watcher' en' connect (watcher, ...); '? – sstock

+0

thx, corrigió el código – TimW