diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp index a2681991a3efdefa9602211c012beed7bd36401e..04ddbda876a41e77cf00aa24a101eb86be9437f2 100644 --- a/src/plugins/cppeditor/cppchecksymbols.cpp +++ b/src/plugins/cppeditor/cppchecksymbols.cpp @@ -51,6 +51,12 @@ using namespace CppEditor::Internal; namespace { +class FriendlyThread: public QThread +{ +public: + using QThread::msleep; +}; + class CollectTypes: protected SymbolVisitor { Document::Ptr _doc; @@ -281,6 +287,7 @@ protected: CheckSymbols::Future CheckSymbols::go(Document::Ptr doc, const LookupContext &context) { Q_ASSERT(doc); + return (new CheckSymbols(doc, context))->start(); } @@ -300,21 +307,17 @@ CheckSymbols::~CheckSymbols() { } void CheckSymbols::run() -{ - if (! isCanceled()) - runFunctor(); - - reportFinished(); -} - -void CheckSymbols::runFunctor() { _diagnosticMessages.clear(); - if (_doc->translationUnit()) { - accept(_doc->translationUnit()->ast()); - flush(); + if (! isCanceled()) { + if (_doc->translationUnit()) { + accept(_doc->translationUnit()->ast()); + flush(); + } } + + reportFinished(); } bool CheckSymbols::warning(unsigned line, unsigned column, const QString &text, unsigned length) @@ -687,6 +690,7 @@ void CheckSymbols::flush() if (_usages.isEmpty()) return; + FriendlyThread::msleep(10); // release some cpu reportResults(_usages); _usages.clear(); } diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cppeditor/cppchecksymbols.h index 43029dbb827a5df0eaba618bcfeab8529de28b94..c63e205c5f8505d98f4bc122a3d2bb5c0917d92b 100644 --- a/src/plugins/cppeditor/cppchecksymbols.h +++ b/src/plugins/cppeditor/cppchecksymbols.h @@ -43,7 +43,8 @@ namespace CPlusPlus { class CheckSymbols: protected ASTVisitor, - public QtConcurrent::RunFunctionTaskBase<CppEditor::Internal::SemanticInfo::Use> + public QRunnable, + public QFutureInterface<CppEditor::Internal::SemanticInfo::Use> { public: virtual ~CheckSymbols(); @@ -51,9 +52,18 @@ public: typedef CppEditor::Internal::SemanticInfo::Use Use; virtual void run(); - void runFunctor(); typedef QFuture<Use> Future; + + Future start() + { + this->setRunnable(this); + this->reportStarted(); + Future future = this->future(); + QThreadPool::globalInstance()->start(this, QThread::IdlePriority); + return future; + } + static Future go(Document::Ptr doc, const LookupContext &context); static QMap<int, QVector<Use> > chunks(const QFuture<Use> &future, int from, int to)