diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 59b008855e4..a98eaa65a3c 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -443,6 +443,7 @@ QString CorePlugin::msgCrashpadInformation() ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown() { Find::aboutToShutdown(); + m_locator->aboutToShutdown(); m_mainWindow->aboutToShutdown(); return SynchronousShutdown; } diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 7bf290612e2..cc1ac31fb70 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -169,6 +169,16 @@ bool Locator::delayedInitialize() return true; } +void Locator::aboutToShutdown() +{ + m_refreshTimer.stop(); + if (m_refreshTask.isRunning()) { + m_refreshTask.cancel(); + m_refreshTask.waitForFinished(); + } + emit aboutToShutdownOccurred(); +} + void Locator::loadSettings() { SettingsDatabase *settings = ICore::settingsDatabase(); diff --git a/src/plugins/coreplugin/locator/locator.h b/src/plugins/coreplugin/locator/locator.h index ea74e90df8b..26e577eb7fb 100644 --- a/src/plugins/coreplugin/locator/locator.h +++ b/src/plugins/coreplugin/locator/locator.h @@ -48,6 +48,7 @@ public: ~Locator() override; static Locator *instance(); + void aboutToShutdown(); void initialize(); void extensionsInitialized(); @@ -62,6 +63,7 @@ public: signals: void filtersChanged(); + void aboutToShutdownOccurred(); public slots: void refresh(QList filters); diff --git a/src/plugins/coreplugin/locator/locatorwidget.cpp b/src/plugins/coreplugin/locator/locatorwidget.cpp index d88bc210adb..2d0f546f108 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.cpp +++ b/src/plugins/coreplugin/locator/locatorwidget.cpp @@ -616,6 +616,13 @@ LocatorWidget::LocatorWidget(Locator *locator) : connect(qApp, &QApplication::focusChanged, this, &LocatorWidget::updatePreviousFocusWidget); connect(locator, &Locator::filtersChanged, this, &LocatorWidget::updateFilterList); + connect(locator, &Locator::aboutToShutdownOccurred, this, [this]() { + m_shuttingDown = true; + if (m_entriesWatcher->isRunning()) { + m_entriesWatcher->cancel(); + m_entriesWatcher->waitForFinished(); + } + }); updateFilterList(); } @@ -828,6 +835,9 @@ void LocatorWidget::setProgressIndicatorVisible(bool visible) void LocatorWidget::updateCompletionList(const QString &text) { + if (m_shuttingDown) + return; + m_updateRequested = true; if (m_entriesWatcher->future().isRunning()) { // Cancel the old future. We may not just block the UI thread to wait for the search to diff --git a/src/plugins/coreplugin/locator/locatorwidget.h b/src/plugins/coreplugin/locator/locatorwidget.h index 99b4afdee5d..5fa538ec0b7 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.h +++ b/src/plugins/coreplugin/locator/locatorwidget.h @@ -98,6 +98,7 @@ private: QTimer m_showPopupTimer; QFutureWatcher *m_entriesWatcher = nullptr; QString m_requestedCompletionText; + bool m_shuttingDown = false; bool m_needsClearResult = true; bool m_updateRequested = false; bool m_possibleToolTipRequest = false;