diff --git a/src/libs/utils/runextensions.h b/src/libs/utils/runextensions.h index f81eb56699c..3e0b7afb952 100644 --- a/src/libs/utils/runextensions.h +++ b/src/libs/utils/runextensions.h @@ -513,23 +513,6 @@ const QFuture &onResultReady(const QFuture &future, QObject *guard, Functi return future; } -/*! - Adds a handler for when a result is ready. - This creates a new QFutureWatcher. Do not use if you intend to react on multiple conditions - or create a QFutureWatcher already for other reasons. -*/ -template -const QFuture &onResultReady(const QFuture &future, Function f) -{ - auto watcher = new QFutureWatcher(); - QObject::connect(watcher, &QFutureWatcherBase::finished, watcher, &QObject::deleteLater); - QObject::connect(watcher, &QFutureWatcherBase::resultReadyAt, [f, watcher](int index) { - f(watcher->future().resultAt(index)); - }); - watcher->setFuture(future); - return future; -} - /*! Adds a handler for when the future is finished. This creates a new QFutureWatcher. Do not use if you intend to react on multiple conditions @@ -568,21 +551,4 @@ const QFuture &onFinished(const QFuture &future, QObject *guard, Function return future; } -/*! - Adds a handler for when the future is finished. - This creates a new QFutureWatcher. Do not use if you intend to react on multiple conditions - or create a QFutureWatcher already for other reasons. -*/ -template -const QFuture &onFinished(const QFuture &future, Function f) -{ - auto watcher = new QFutureWatcher(); - QObject::connect(watcher, &QFutureWatcherBase::finished, watcher, &QObject::deleteLater); - QObject::connect(watcher, &QFutureWatcherBase::finished, [f, watcher] { - f(watcher->future()); - }); - watcher->setFuture(future); - return future; -} - } // namespace Utils diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 14dc9112e84..3ec9457ee37 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -684,9 +684,9 @@ void AndroidRunnerWorker::asyncStart() { asyncStartHelper(); - m_pidFinder = Utils::onResultReady(Utils::asyncRun(findProcessPID, selector(), - m_packageName, m_isPreNougat), - bind(&AndroidRunnerWorker::onProcessIdChanged, this, _1)); + m_pidFinder = Utils::onResultReady( + Utils::asyncRun(findProcessPID, selector(),m_packageName, m_isPreNougat), this, + bind(&AndroidRunnerWorker::onProcessIdChanged, this, _1)); } void AndroidRunnerWorker::asyncStop() diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index c2b1ce6d6b3..56f32833c86 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -644,7 +644,7 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a } }; m_optionsFuture = sdkManager->availableArguments(); - Utils::onResultReady(m_optionsFuture, populateOptions); + Utils::onResultReady(m_optionsFuture, this, populateOptions); auto dialogButtons = new QDialogButtonBox(this); dialogButtons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); diff --git a/src/plugins/ios/createsimulatordialog.cpp b/src/plugins/ios/createsimulatordialog.cpp index 784c33742ff..5dce52221eb 100644 --- a/src/plugins/ios/createsimulatordialog.cpp +++ b/src/plugins/ios/createsimulatordialog.cpp @@ -61,10 +61,10 @@ CreateSimulatorDialog::CreateSimulatorDialog(QWidget *parent) }); m_futureSync.setCancelOnWait(true); - m_futureSync.addFuture(Utils::onResultReady(SimulatorControl::updateDeviceTypes(), this, + m_futureSync.addFuture(Utils::onResultReady(SimulatorControl::updateDeviceTypes(this), this, &CreateSimulatorDialog::populateDeviceTypes)); - QFuture> runtimesfuture = SimulatorControl::updateRuntimes(); + QFuture> runtimesfuture = SimulatorControl::updateRuntimes(this); Utils::onResultReady(runtimesfuture, this, [this](const QList &runtimes) { m_runtimes = runtimes; }); diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index 54674de8ecb..93c00fb2ee6 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -404,7 +404,7 @@ void IosConfigurations::updateSimulators() dev = IDevice::ConstPtr(new IosSimulator(devId)); devManager->addDevice(dev); } - SimulatorControl::updateAvailableSimulators(); + SimulatorControl::updateAvailableSimulators(this); } void IosConfigurations::setDeveloperPath(const FilePath &devPath) diff --git a/src/plugins/ios/iossettingswidget.cpp b/src/plugins/ios/iossettingswidget.cpp index 8c4149a91ba..eee8b08efc8 100644 --- a/src/plugins/ios/iossettingswidget.cpp +++ b/src/plugins/ios/iossettingswidget.cpp @@ -175,7 +175,7 @@ void IosSettingsWidget::onStart() Utils::StdErrFormat); } else { futureList << QFuture(Utils::onResultReady( - SimulatorControl::startSimulator(info.identifier), + SimulatorControl::startSimulator(info.identifier), this, std::bind(onSimOperation, info, statusDialog, Tr::tr("simulator start"), _1))); } } @@ -207,11 +207,9 @@ void IosSettingsWidget::onCreate() CreateSimulatorDialog createDialog(this); if (createDialog.exec() == QDialog::Accepted) { - QFuture f = QFuture( - Utils::onResultReady(SimulatorControl::createSimulator(createDialog.name(), - createDialog.deviceType(), - createDialog.runtime()), - std::bind(onSimulatorCreate, createDialog.name(), _1))); + QFuture f = QFuture(Utils::onResultReady(SimulatorControl::createSimulator( + createDialog.name(), createDialog.deviceType(), createDialog.runtime()), + this, std::bind(onSimulatorCreate, createDialog.name(), _1))); statusDialog->addFutures({ f }); statusDialog->exec(); // Modal dialog returns only when all the operations are done or cancelled. } @@ -242,7 +240,7 @@ void IosSettingsWidget::onReset() QList> futureList; for (const SimulatorInfo &info : simulatorInfoList) { futureList << QFuture(Utils::onResultReady( - SimulatorControl::resetSimulator(info.identifier), + SimulatorControl::resetSimulator(info.identifier), this, std::bind(onSimOperation, info, statusDialog, Tr::tr("simulator reset"), _1))); } @@ -270,7 +268,7 @@ void IosSettingsWidget::onRename() statusDialog->setAttribute(Qt::WA_DeleteOnClose); statusDialog->addMessage(Tr::tr("Renaming simulator device..."), Utils::NormalMessageFormat); QFuture f = QFuture(Utils::onResultReady( - SimulatorControl::renameSimulator(simInfo.identifier, newName), + SimulatorControl::renameSimulator(simInfo.identifier, newName), this, std::bind(onSimOperation, simInfo, statusDialog, Tr::tr("simulator rename"), _1))); statusDialog->addFutures({f}); statusDialog->exec(); // Modal dialog returns only when all the operations are done or cancelled. @@ -300,7 +298,7 @@ void IosSettingsWidget::onDelete() QList> futureList; for (const SimulatorInfo &info : simulatorInfoList) { futureList << QFuture(Utils::onResultReady( - SimulatorControl::deleteSimulator(info.identifier), + SimulatorControl::deleteSimulator(info.identifier), this, std::bind(onSimOperation, info, statusDialog, Tr::tr("simulator delete"), _1))); } @@ -331,7 +329,7 @@ void IosSettingsWidget::onScreenshot() QList> futureList; for (const SimulatorInfo &info : simulatorInfoList) { futureList << QFuture(Utils::onResultReady( - SimulatorControl::takeSceenshot(info.identifier, generatePath(info)), + SimulatorControl::takeSceenshot(info.identifier, generatePath(info)), this, std::bind(onSimOperation, info, statusDialog, Tr::tr("simulator screenshot"), _1))); } diff --git a/src/plugins/ios/iostoolhandler.cpp b/src/plugins/ios/iostoolhandler.cpp index b8a3c592ef4..5db9b808a88 100644 --- a/src/plugins/ios/iostoolhandler.cpp +++ b/src/plugins/ios/iostoolhandler.cpp @@ -815,8 +815,8 @@ void IosSimulatorToolHandlerPrivate::requestTransferApp(const QString &appBundle if (SimulatorControl::isSimulatorRunning(m_deviceId)) installAppOnSimulator(); else - futureSynchronizer.addFuture( - Utils::onResultReady(SimulatorControl::startSimulator(m_deviceId), onSimulatorStart)); + futureSynchronizer.addFuture(Utils::onResultReady( + SimulatorControl::startSimulator(m_deviceId), q, onSimulatorStart)); } void IosSimulatorToolHandlerPrivate::requestRunApp(const QString &appBundlePath, @@ -852,8 +852,8 @@ void IosSimulatorToolHandlerPrivate::requestRunApp(const QString &appBundlePath, if (SimulatorControl::isSimulatorRunning(m_deviceId)) launchAppOnSimulator(extraArgs); else - futureSynchronizer.addFuture( - Utils::onResultReady(SimulatorControl::startSimulator(m_deviceId), onSimulatorStart)); + futureSynchronizer.addFuture(Utils::onResultReady( + SimulatorControl::startSimulator(m_deviceId), q, onSimulatorStart)); } void IosSimulatorToolHandlerPrivate::requestDeviceInfo(const QString &deviceId, int timeout) @@ -905,7 +905,7 @@ void IosSimulatorToolHandlerPrivate::installAppOnSimulator() isTransferringApp(m_bundlePath, m_deviceId, 20, 100, ""); auto installFuture = SimulatorControl::installApp(m_deviceId, Utils::FilePath::fromString(m_bundlePath)); - futureSynchronizer.addFuture(Utils::onResultReady(installFuture, onResponseAppInstall)); + futureSynchronizer.addFuture(Utils::onResultReady(installFuture, q, onResponseAppInstall)); } void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &extraArgs) @@ -968,16 +968,11 @@ void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &ext } }; - futureSynchronizer.addFuture( - Utils::onResultReady(SimulatorControl::launchApp(m_deviceId, - bundleId, - debugRun, - extraArgs, - captureConsole ? stdoutFile->fileName() - : QString(), - captureConsole ? stderrFile->fileName() - : QString()), - onResponseAppLaunch)); + futureSynchronizer.addFuture(Utils::onResultReady(SimulatorControl::launchApp( + m_deviceId, bundleId, debugRun, extraArgs, + captureConsole ? stdoutFile->fileName() : QString(), + captureConsole ? stderrFile->fileName() : QString()), + q, onResponseAppLaunch)); } bool IosSimulatorToolHandlerPrivate::isResponseValid(const SimulatorControl::ResponseData &responseData) diff --git a/src/plugins/ios/simulatorcontrol.cpp b/src/plugins/ios/simulatorcontrol.cpp index 6a19513fd2a..59970b649c1 100644 --- a/src/plugins/ios/simulatorcontrol.cpp +++ b/src/plugins/ios/simulatorcontrol.cpp @@ -235,10 +235,10 @@ static QList getAvailableSimulators() return availableDevices; } -QFuture> SimulatorControl::updateDeviceTypes() +QFuture> SimulatorControl::updateDeviceTypes(QObject *context) { QFuture> future = Utils::asyncRun(getAvailableDeviceTypes); - Utils::onResultReady(future, [](const QList &deviceTypes) { + Utils::onResultReady(future, context, [](const QList &deviceTypes) { s_availableDeviceTypes = deviceTypes; }); return future; @@ -249,20 +249,21 @@ QList SimulatorControl::availableRuntimes() return s_availableRuntimes; } -QFuture> SimulatorControl::updateRuntimes() +QFuture> SimulatorControl::updateRuntimes(QObject *context) { QFuture> future = Utils::asyncRun(getAvailableRuntimes); - Utils::onResultReady(future, [](const QList &runtimes) { + Utils::onResultReady(future, context, [](const QList &runtimes) { s_availableRuntimes = runtimes; }); return future; } -QFuture> SimulatorControl::updateAvailableSimulators() +QFuture> SimulatorControl::updateAvailableSimulators(QObject *context) { QFuture> future = Utils::asyncRun(getAvailableSimulators); - Utils::onResultReady(future, - [](const QList &devices) { s_availableDevices = devices; }); + Utils::onResultReady(future, context, [](const QList &devices) { + s_availableDevices = devices; + }); return future; } diff --git a/src/plugins/ios/simulatorcontrol.h b/src/plugins/ios/simulatorcontrol.h index 90a0a6ac4b2..402100fbeac 100644 --- a/src/plugins/ios/simulatorcontrol.h +++ b/src/plugins/ios/simulatorcontrol.h @@ -65,11 +65,11 @@ public: public: static QList availableDeviceTypes(); - static QFuture> updateDeviceTypes(); + static QFuture> updateDeviceTypes(QObject *context); static QList availableRuntimes(); - static QFuture> updateRuntimes(); + static QFuture> updateRuntimes(QObject *context); static QList availableSimulators(); - static QFuture> updateAvailableSimulators(); + static QFuture> updateAvailableSimulators(QObject *context); static bool isSimulatorRunning(const QString &simUdid); static QString bundleIdentifier(const Utils::FilePath &bundlePath); static QString bundleExecutable(const Utils::FilePath &bundlePath); diff --git a/src/plugins/ios/simulatorinfomodel.cpp b/src/plugins/ios/simulatorinfomodel.cpp index df58dc98cba..8c79d161da9 100644 --- a/src/plugins/ios/simulatorinfomodel.cpp +++ b/src/plugins/ios/simulatorinfomodel.cpp @@ -109,7 +109,7 @@ void SimulatorInfoModel::requestSimulatorInfo() if (!m_fetchFuture.isEmpty()) return; // Ignore the request if the last request is still pending. - m_fetchFuture.addFuture(Utils::onResultReady(SimulatorControl::updateAvailableSimulators(), + m_fetchFuture.addFuture(Utils::onResultReady(SimulatorControl::updateAvailableSimulators(this), this, &SimulatorInfoModel::populateSimulators)); } diff --git a/tests/auto/runextensions/tst_runextensions.cpp b/tests/auto/runextensions/tst_runextensions.cpp index 50a3f8a40d6..d9b989582ce 100644 --- a/tests/auto/runextensions/tst_runextensions.cpp +++ b/tests/auto/runextensions/tst_runextensions.cpp @@ -553,13 +553,14 @@ public: void tst_RunExtensions::onResultReady() { { // lambda + QObject context; QFuture f = Utils::runAsync([](QFutureInterface &fi) { fi.reportResult("Hi"); fi.reportResult("there"); }); int count = 0; QString res; - Utils::onResultReady(f, [&count, &res](const QString &s) { + Utils::onResultReady(f, &context, [&count, &res](const QString &s) { ++count; res = s; });