void tst_iteratekernel::cancel() { { QFuture<void> f = startThreadEngine(new SleepPrintFor(0, 40)).startAsynchronously(); f.cancel(); f.waitForFinished(); QVERIFY(f.isCanceled()); QVERIFY(int(iterations) <= QThread::idealThreadCount()); // the threads might run one iteration each before they are canceled. } }
void tst_QtConcurrentIterateKernel::cancel() { { QFuture<void> f = startThreadEngine(new SleepPrintFor(0, 40)).startAsynchronously(); f.cancel(); f.waitForFinished(); QVERIFY(f.isCanceled()); // the threads might run one iteration each before they are canceled. QVERIFY2(iterations.load() <= QThread::idealThreadCount(), (QByteArray::number(iterations.load()) + ' ' + QByteArray::number(QThread::idealThreadCount()))); } }
void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data, CppTools::ProjectPart *, RenameCallback &&renameSymbolsCallback) { ClangEditorDocumentProcessor *processor = ClangEditorDocumentProcessor::get( data.filePath().toString()); const int startRevision = data.cursor().document()->revision(); using ClangBackEnd::SourceLocationsContainer; auto defaultCallback = [renameSymbolsCallback, startRevision]() { return renameSymbolsCallback(QString(), SourceLocationsContainer{}, startRevision); }; if (!processor) return defaultCallback(); QFuture<CppTools::CursorInfo> cursorFuture = processor->requestLocalReferences(data.cursor()); if (cursorFuture.isCanceled()) return defaultCallback(); if (m_watcher) m_watcher->cancel(); m_watcher.reset(new FutureCursorWatcher()); QObject::connect(m_watcher.get(), &FutureCursorWatcher::finished, [=]() { if (m_watcher->isCanceled()) return defaultCallback(); const CppTools::CursorInfo info = m_watcher->result(); if (info.useRanges.empty()) return defaultCallback(); QTextCursor cursor = Utils::Text::wordStartCursor(data.cursor()); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, info.useRanges.first().length); const QString symbolName = cursor.selectedText(); ClangBackEnd::SourceLocationsContainer container; for (auto& use : info.useRanges) { container.insertSourceLocation(ClangBackEnd::FilePathId(), use.line, use.column, use.length); } renameSymbolsCallback(symbolName, container, data.cursor().document()->revision()); }); m_watcher->setFuture(cursorFuture); }
void tst_QFutureWatcher::canceled() { const int listSize = 20; QList<int> list = createList(listSize); QFutureWatcher<void> futureWatcher; QFuture<void> future; CancelObject cancelObject; QObject::connect(&futureWatcher, SIGNAL(canceled()), &cancelObject, SLOT(cancel())); QObject::connect(&futureWatcher, SIGNAL(canceled()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection); future = QtConcurrent::map(list, mapSleeper); futureWatcher.setFuture(future); futureWatcher.cancel(); QTestEventLoop::instance().enterLoop(5); QVERIFY(!QTestEventLoop::instance().timeout()); QVERIFY(future.isCanceled()); QVERIFY(cancelObject.wasCanceled); futureWatcher.disconnect(); future.waitForFinished(); }
void tst_QFuture::cancel() { { QFuture<void> f; QFutureInterface<void> result; result.reportStarted(); f = result.future(); QVERIFY(!f.isCanceled()); result.reportCanceled(); QVERIFY(f.isCanceled()); result.reportFinished(); QVERIFY(f.isCanceled()); f.waitForFinished(); QVERIFY(f.isCanceled()); } // Cancel from the QFuture side and test if the result // interface detects it. { QFutureInterface<void> result; QFuture<void> f; QVERIFY(f.isStarted()); result.reportStarted(); f = result.future(); QVERIFY(f.isStarted()); QVERIFY(!result.isCanceled()); f.cancel(); QVERIFY(result.isCanceled()); result.reportFinished(); } // Test that finished futures can be canceled. { QFutureInterface<void> result; QFuture<void> f; QVERIFY(f.isStarted()); result.reportStarted(); f = result.future(); QVERIFY(f.isStarted()); result.reportFinished(); f.cancel(); QVERIFY(result.isCanceled()); QVERIFY(f.isCanceled()); } // Results reported after canceled is called should not be propagated. { QFutureInterface<int> futureInterface; futureInterface.reportStarted(); QFuture<int> f = futureInterface.future(); int result = 0; futureInterface.reportResult(&result); result = 1; futureInterface.reportResult(&result); f.cancel(); result = 2; futureInterface.reportResult(&result); result = 3; futureInterface.reportResult(&result); futureInterface.reportFinished(); QCOMPARE(f.results(), QList<int>()); } }
void tst_QFuture::futureInterface() { { QFuture<void> future; { QFutureInterface<void> i; i.reportStarted(); future = i.future(); i.reportFinished(); } } { QFuture<int> future; { QFutureInterface<int> i; i.reportStarted(); i.reportResult(10); future = i.future(); i.reportFinished(); } QCOMPARE(future.resultAt(0), 10); } { QFuture<int> intFuture; QCOMPARE(intFuture.isStarted(), true); QCOMPARE(intFuture.isFinished(), true); IntResult result; result.reportStarted(); intFuture = result.future(); QCOMPARE(intFuture.isStarted(), true); QCOMPARE(intFuture.isFinished(), false); result.reportFinished(&value); QCOMPARE(intFuture.isStarted(), true); QCOMPARE(intFuture.isFinished(), true); int e = intFuture.result(); QCOMPARE(intFuture.isStarted(), true); QCOMPARE(intFuture.isFinished(), true); QCOMPARE(intFuture.isCanceled(), false); QCOMPARE(e, value); intFuture.waitForFinished(); IntResult intAlgo; intFuture = intAlgo.run(); QFuture<int> intFuture2(intFuture); QCOMPARE(intFuture.result(), value); QCOMPARE(intFuture2.result(), value); intFuture.waitForFinished(); VoidResult a; a.run().waitForFinished(); } }