2012-09-21 4 views
9

Wenn ich den folgenden Code aus der QFutureWatcher Dokumentation richtig verstanden habe, dann eine Racebedingung zwischen dem letzten Zeilen besteht:Wie kann ich einen QFutureWatcher mit QtConcurrent :: run() ohne Racebedingung

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

Wenn die Funktion ... im QtConcurrent::run(...) beendet wird, bevor die nächste Zeile aufgerufen wird, wird das Signal watcher.finished() niemals ausgelöst. Ist meine Annahme richtig? Wie kann ich diesen Fehler beheben?

Antwort

11

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

Eines der Signale könnte für den aktuellen Zustand der Zukunft emittiert werden. Wenn beispielsweise die Zukunft bereits gestoppt ist, wird das fertige Signal ausgegeben.

Mit anderen Worten, wenn QtConcurrent::run(...) abgeschlossen ist, bevor setFuture genannt wird, setFuture wird noch ein Signal auf dem aktuellen Stand der QFuture emittieren. Sie müssen also nichts tun, um eine Wettlaufsituation zu vermeiden.

jedoch in Abhängigkeit von dem Rest des Codes, müssen Sie möglicherweise QFuture::waitForFinished() fordern, um zu gewährleisten, dass Ihre MyClass, QFuture und QFutureWatcher nicht außerhalb des Gültigkeitsbereiches gehen vorQtConcurrent::run(...) abgeschlossen ist.

Verwandte Themen