void tst_QtConcurrentThreadEngine::cancel() { { CancelUser *engine = new CancelUser(); QFuture<void> f = engine->startAsynchronously(); f.cancel(); f.waitForFinished(); } { CancelUser *engine = new CancelUser(); QFuture<void> f = engine->startAsynchronously(); QTest::qSleep(10); f.cancel(); f.waitForFinished(); } }
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 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>()); } }
bool generateImagesAndXML() { QString baseDestDir=mInfo->destUrl().toLocalFile(); if (!createDir(baseDestDir)) return false; mXMLFileName=baseDestDir + "/gallery.xml"; XMLWriter xmlWriter; if (!xmlWriter.open(mXMLFileName)) { logError(i18n("Could not create gallery.xml")); return false; } XMLElement collectionsX(xmlWriter, "collections"); // Loop on collections QList<ImageCollection>::ConstIterator collectionIt=mInfo->mCollectionList.constBegin(); QList<ImageCollection>::ConstIterator collectionEnd=mInfo->mCollectionList.constEnd(); for (; collectionIt!=collectionEnd; ++collectionIt) { ImageCollection collection=*collectionIt; QString collectionFileName = webifyFileName(collection.name()); QString destDir = baseDestDir + '/' + collectionFileName; if (!createDir(destDir)) return false; XMLElement collectionX(xmlWriter, "collection"); xmlWriter.writeElement("name", collection.name()); xmlWriter.writeElement("fileName", collectionFileName); xmlWriter.writeElement("comment", collection.comment()); // Gather image element list KUrl::List imageList = collection.images(); RemoteUrlHash remoteUrlHash; if (!downloadRemoteUrls(collection.name(), imageList, &remoteUrlHash)) { return false; } QList<ImageElement> imageElementList; Q_FOREACH(const KUrl& url, imageList) { const QString path = remoteUrlHash.value(url, url.toLocalFile()); if (path.isEmpty()) { continue; } KPImageInfo info(url); ImageElement element = ImageElement(info); element.mPath = remoteUrlHash.value(url, url.toLocalFile()); imageElementList << element; } // Generate images logInfo( i18n("Generating files for \"%1\"", collection.name()) ); ImageGenerationFunctor functor(that, mInfo, destDir); QFuture<void> future = QtConcurrent::map(imageElementList, functor); QFutureWatcher<void> watcher; watcher.setFuture(future); connect(&watcher, SIGNAL(progressValueChanged(int)), mProgressDialog->progressWidget(), SLOT(setProgress(int))); mProgressDialog->progressWidget()->setTotal(imageElementList.count()); while (!future.isFinished()) { qApp->processEvents(); if (mProgressDialog->isHidden()) { future.cancel(); future.waitForFinished(); return false; } } // Generate xml Q_FOREACH(const ImageElement& element, imageElementList) { element.appendToXML(xmlWriter, mInfo->copyOriginalImage()); } }