diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 3c7504d7ee0ffebfed96122ec93b56882e1e06f1..c85233e0c25dbd47429847a30f32df703d782a52 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -35,6 +35,7 @@ #include <functional> #include <QtConcurrentRun> +#include <QFutureSynchronizer> #include <qtconcurrent/runextensions.h> #include <texteditor/itexteditor.h> @@ -163,6 +164,7 @@ class CppPreprocessor: public CPlusPlus::Client { public: CppPreprocessor(QPointer<CppModelManager> modelManager); + virtual ~CppPreprocessor(); void setWorkingCopy(const QMap<QString, QByteArray> &workingCopy); void setIncludePaths(const QStringList &includePaths); @@ -212,6 +214,7 @@ private: Document::Ptr m_currentDoc; QSet<QString> m_todo; QSet<QString> m_processed; + QFutureSynchronizer<void> m_synchronizer; }; } // namespace Internal @@ -221,6 +224,11 @@ CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager) : snapshot(modelManager->snapshot()), m_modelManager(modelManager), preprocess(this, &env) +{ + m_synchronizer.setCancelOnWait(true); +} + +CppPreprocessor::~CppPreprocessor() { } void CppPreprocessor::setWorkingCopy(const QMap<QString, QByteArray> &workingCopy) @@ -502,7 +510,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type, snapshot.insert(doc->fileName(), doc); m_todo.remove(fileName); - QtConcurrent::run(Process(m_modelManager), doc); + m_synchronizer.addFuture(QtConcurrent::run(Process(m_modelManager), doc)); (void) switchDocument(previousDoc); } @@ -528,6 +536,8 @@ Document::Ptr CppPreprocessor::switchDocument(Document::Ptr doc) CppModelManager::CppModelManager(QObject *parent) : CppModelManagerInterface(parent) { + m_synchronizer.setCancelOnWait(true); + m_core = Core::ICore::instance(); // FIXME m_dirty = true; @@ -702,6 +712,8 @@ QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles QFuture<void> result = QtConcurrent::run(&CppModelManager::parse, preproc, sourceFiles); + m_synchronizer.addFuture(result); + if (sourceFiles.count() > 1) { m_core->progressManager()->addTask(result, tr("Indexing"), CppTools::Constants::TASK_INDEX, diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index f20aa23895c250dda8cfe003801530ed7e7fe26a..9f2c2f221e21d1d9db66eca904f68866d4da521a 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -38,6 +38,7 @@ #include <QMap> #include <QFutureInterface> +#include <QFutureSynchronizer> #include <QMutex> #include <QTimer> #include <QTextEdit> @@ -174,6 +175,8 @@ private: QList<Editor> m_todo; QTimer *m_updateEditorSelectionsTimer; + + QFutureSynchronizer<void> m_synchronizer; }; } // namespace Internal