2012-09-21 256 views
9

如果我正確理解從QFutureWatcher文檔下面的代碼,再有就是最後之間的競爭條件,以線:如何使用與QtConcurrent一個QFutureWatcher :: run()的無競爭狀態

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

如果QtConcurrent::run(...)中的功能...在下一行被調用之前完成,那麼將永遠不會觸發watcher.finished()信號。我的假設是否正確?我如何解決這個bug?

回答

11

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

信號之一可能是發出了 未來的當前狀態。例如,如果未來已經停止,則將發出完成的 信號。

換言之,如果前setFuture完成QtConcurrent::run(...)被調用,setFuture仍然會發出對QFuture的當前狀態的信號。所以,你不需要做任何事情來避免競爭狀況。

但是,根據你的代碼的其餘部分,你可能需要調用QFuture::waitForFinished(),以確保您的MyClassQFutureQFutureWatcher不出去的範圍QtConcurrent::run(...)完成。