2012-09-21 22 views
9

Nếu tôi hiểu đoạn mã sau từ tài liệu QFutureWatcher một cách chính xác, sau đó là một điều kiện chủng tộc giữa người cuối cùng dòng:Làm thế nào tôi có thể sử dụng một QFutureWatcher với QtConcurrent :: run() mà không có một điều kiện chủng tộc

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

Nếu chức năng ... trong kết thúc QtConcurrent::run(...) trước khi dòng kế tiếp được gọi, thì tín hiệu watcher.finished() sẽ không bao giờ được kích hoạt. Giả định của tôi có đúng không? Làm cách nào để khắc phục lỗi này?

Trả lời

11

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

Một trong những tín hiệu có thể được phát ra cho tình trạng hiện tại của tương lai . Ví dụ: nếu tương lai đã bị dừng, tín hiệu đã hoàn thành sẽ được phát ra.

Nói cách khác, nếu QtConcurrent::run(...) hoàn tất trước khi setFuture được gọi, setFuture vẫn sẽ phát ra một tín hiệu về tình trạng hiện tại của QFuture. Vì vậy, bạn không cần phải làm bất cứ điều gì để tránh tình trạng chạy đua.

Tuy nhiên, tùy thuộc vào phần còn lại của mã của bạn, bạn có thể cần phải gọi QFuture::waitForFinished() để đảm bảo rằng bạn MyClass, QFutureQFutureWatcher không đi ra khỏi phạm vi trướcQtConcurrent::run(...) hoàn tất.

Các vấn đề liên quan