2012-09-21 21 views
9

Si entiendo el siguiente código de la documentación QFutureWatcher correctamente, entonces hay una condición de carrera entre el último a las líneas:¿Cómo puedo utilizar un QFutureWatcher con QtConcurrent :: run() sin una condición de carrera

// Instantiate the objects and connect to the finished signal. 
MyClass myObject; 
QFutureWatcher<int> watcher; 
connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished())); 

// Start the computation. 
QFuture<int> future = QtConcurrent::run(...); 
watcher.setFuture(future); 

Si la función ... en el QtConcurrent::run(...) finaliza antes de llamar a la línea siguiente, la señal watcher.finished() nunca se activará. ¿Mi suposición es correcta? ¿Cómo puedo solucionar este error?

Respuesta

11

De http://doc.qt.io/qt-4.8/qfuturewatcher.html#setFuture

Una de las señales pueden emitirse para el estado actual de la futura . Por ejemplo, si el futuro ya está detenido, se emitirá la señal terminada.

En otras palabras, si se realiza antes de QtConcurrent::run(...)setFuture se llama, todavía setFuture emitirá una señal sobre el estado actual de la QFuture. Por lo tanto, no es necesario que haga nada para evitar una condición de carrera.

Sin embargo, dependiendo del resto de su código, puede que tenga que llamar a QFuture::waitForFinished() con el fin de asegurarse de que su MyClass, QFuture y QFutureWatcher no van fuera de alcance antes QtConcurrent::run(...) ultima.

Cuestiones relacionadas