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)