Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
855 views
in Technique[技术] by (71.8m points)

c++ - 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...