Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use a QFutureWatcher with QtConcurrent::run() without a race condition

If I understand the following code from the QFutureWatcher documentation correctly, then there is a race condition between the last to lines:

// 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);

If the function ... in the QtConcurrent::run(...) finishes before the next line is called, then the watcher.finished() signal will never be triggered. Is my assumption correct? How do I work around this bug?

like image 764
Ralph Tandetzky Avatar asked Sep 21 '12 08:09

Ralph Tandetzky


1 Answers

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

One of the signals might be emitted for the current state of the future. For example, if the future is already stopped, the finished signal will be emitted.

In other words, if QtConcurrent::run(...) completes before setFuture is called, setFuture will still emit a signal on the current state of the QFuture. So, you don't need to do anything in order to avoid a race condition.

However, depending on the rest of your code, you may need to call QFuture::waitForFinished() in order to ensure that your MyClass, QFuture and QFutureWatcher do not go out of scope before QtConcurrent::run(...) completes.

like image 153
Adam Bowen Avatar answered Oct 02 '22 10:10

Adam Bowen