aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/classview/classviewmanager.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2021-02-18 15:02:54 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2021-02-19 10:29:45 +0000
commitcb7b3dd8173225043399aa777bbd0da1028ba0c9 (patch)
tree623499a919c22039dda737cb177ba484f226f2b0 /src/plugins/classview/classviewmanager.cpp
parentaeac17ecf5e0c650bbf33a4ff0297aa4ba2bc9f3 (diff)
ClassView: Move delaying of update into the main thread
Minimize the communication with parser's thread. Don't call getParseDocumentTree() multiple times when subsequent request for the same document comes before the timeout. Don't queue again already queued documentUpdated() signal (it's emitted form non-gui thread). Prepare for moving the calls to SessionManager out of the parser's thread. Task-number: QTCREATORBUG-25317 Change-Id: I5d4898b5addbb589d415e00c66de5cba7b96d512 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/plugins/classview/classviewmanager.cpp')
-rw-r--r--src/plugins/classview/classviewmanager.cpp116
1 files changed, 73 insertions, 43 deletions
diff --git a/src/plugins/classview/classviewmanager.cpp b/src/plugins/classview/classviewmanager.cpp
index e51cef78b9..7724fbc493 100644
--- a/src/plugins/classview/classviewmanager.cpp
+++ b/src/plugins/classview/classviewmanager.cpp
@@ -41,6 +41,7 @@
#include <texteditor/texteditor.h>
#include <QThread>
+#include <QTimer>
using namespace Core;
using namespace Utils;
@@ -92,51 +93,37 @@ public:
QThread m_parserThread;
ParserTreeItem::ConstPtr m_root;
+ QTimer m_timer;
+ QHash<QString, CPlusPlus::Document::Ptr> m_awaitingDocuments;
+
//! Internal manager state. \sa Manager::state
bool state = false;
//! there is some massive operation ongoing so temporary we should wait
bool disableCodeParser = false;
-};
-///////////////////////////////// Manager //////////////////////////////////
-
-Manager::Manager(QObject *parent)
- : QObject(parent),
- d(new ManagerPrivate())
-{
- d->m_parser = new Parser();
- d->m_parser->moveToThread(&d->m_parserThread);
- connect(&d->m_parserThread, &QThread::finished, d->m_parser, &QObject::deleteLater);
- managerInstance = this;
-
- // register - to be able send between signal/slots
- qRegisterMetaType<QSharedPointer<QStandardItem> >("QSharedPointer<QStandardItem>");
-
- initialize();
-
- // start a separate thread for the parser
- d->m_parserThread.start();
-}
+ void cancelScheduledUpdate();
+ void resetParser();
+ ParserTreeItem::ConstPtr findItemByRoot(const QStandardItem *item, bool skipRoot = false) const;
+};
-Manager::~Manager()
+void ManagerPrivate::cancelScheduledUpdate()
{
- d->m_parserThread.quit();
- d->m_parserThread.wait();
- delete d;
- managerInstance = nullptr;
+ m_timer.stop();
+ m_awaitingDocuments.clear();
}
-Manager *Manager::instance()
+void ManagerPrivate::resetParser()
{
- return managerInstance;
+ cancelScheduledUpdate();
+ QMetaObject::invokeMethod(m_parser, &Parser::resetDataToCurrentState, Qt::QueuedConnection);
}
/*!
Returns the internal tree item for \a item. \a skipRoot skips the root
item.
*/
-ParserTreeItem::ConstPtr Manager::findItemByRoot(const QStandardItem *item, bool skipRoot) const
+ParserTreeItem::ConstPtr ManagerPrivate::findItemByRoot(const QStandardItem *item, bool skipRoot) const
{
if (!item)
return ParserTreeItem::ConstPtr();
@@ -152,7 +139,7 @@ ParserTreeItem::ConstPtr Manager::findItemByRoot(const QStandardItem *item, bool
if (skipRoot && uiList.count() > 0)
uiList.removeLast();
- ParserTreeItem::ConstPtr internal = d->m_root;
+ ParserTreeItem::ConstPtr internal = m_root;
while (uiList.count() > 0) {
cur = uiList.last();
uiList.removeLast();
@@ -165,12 +152,45 @@ ParserTreeItem::ConstPtr Manager::findItemByRoot(const QStandardItem *item, bool
return internal;
}
+///////////////////////////////// Manager //////////////////////////////////
+
+Manager::Manager(QObject *parent)
+ : QObject(parent),
+ d(new ManagerPrivate())
+{
+ d->m_parser = new Parser();
+ d->m_parser->moveToThread(&d->m_parserThread);
+ connect(&d->m_parserThread, &QThread::finished, d->m_parser, &QObject::deleteLater);
+ managerInstance = this;
+
+ // register - to be able send between signal/slots
+ qRegisterMetaType<QSharedPointer<QStandardItem> >("QSharedPointer<QStandardItem>");
+
+ initialize();
+
+ // start a separate thread for the parser
+ d->m_parserThread.start();
+}
+
+Manager::~Manager()
+{
+ d->m_parserThread.quit();
+ d->m_parserThread.wait();
+ delete d;
+ managerInstance = nullptr;
+}
+
+Manager *Manager::instance()
+{
+ return managerInstance;
+}
+
/*!
Checks \a item for lazy data population of a QStandardItemModel.
*/
bool Manager::canFetchMore(QStandardItem *item, bool skipRoot) const
{
- ParserTreeItem::ConstPtr ptr = findItemByRoot(item, skipRoot);
+ ParserTreeItem::ConstPtr ptr = d->findItemByRoot(item, skipRoot);
if (ptr.isNull())
return false;
return ptr->canFetchMore(item);
@@ -182,7 +202,7 @@ bool Manager::canFetchMore(QStandardItem *item, bool skipRoot) const
*/
void Manager::fetchMore(QStandardItem *item, bool skipRoot)
{
- ParserTreeItem::ConstPtr ptr = findItemByRoot(item, skipRoot);
+ ParserTreeItem::ConstPtr ptr = d->findItemByRoot(item, skipRoot);
if (ptr.isNull())
return;
ptr->fetchMore(item);
@@ -190,7 +210,7 @@ void Manager::fetchMore(QStandardItem *item, bool skipRoot)
bool Manager::hasChildren(QStandardItem *item) const
{
- ParserTreeItem::ConstPtr ptr = findItemByRoot(item);
+ ParserTreeItem::ConstPtr ptr = d->findItemByRoot(item);
if (ptr.isNull())
return false;
return ptr->childCount();
@@ -199,6 +219,7 @@ bool Manager::hasChildren(QStandardItem *item) const
void Manager::initialize()
{
using ProjectExplorer::SessionManager;
+ d->m_timer.setSingleShot(true);
// connections to enable/disable navi widget factory
SessionManager *sessionManager = SessionManager::instance();
@@ -215,6 +236,7 @@ void Manager::initialize()
// disable tree updates to speed up
d->disableCodeParser = true;
+ d->cancelScheduledUpdate();
});
connect(ProgressManager::instance(), &ProgressManager::allTasksFinished,
this, [this](Id type) {
@@ -229,7 +251,7 @@ void Manager::initialize()
return;
// request to update a tree to the current state
- resetParser();
+ d->resetParser();
});
connect(d->m_parser, &Parser::treeRegenerated,
@@ -258,10 +280,23 @@ void Manager::initialize()
if (d->disableCodeParser)
return;
- QMetaObject::invokeMethod(d->m_parser, [this, doc]() {
- d->m_parser->parseDocument(doc); }, Qt::QueuedConnection);
- }, Qt::QueuedConnection);
- //
+ if (doc.data() == nullptr)
+ return;
+
+ d->m_awaitingDocuments.insert(doc->fileName(), doc);
+ d->m_timer.start(400); // Accumulate multiple requests into one, restarts the timer
+ });
+
+ connect(&d->m_timer, &QTimer::timeout, this, [this]() {
+ const QList<CPlusPlus::Document::Ptr> docsToBeUpdated = d->m_awaitingDocuments.values();
+ d->cancelScheduledUpdate();
+ if (!state() || d->disableCodeParser) // enabling any of them will trigger the total update
+ return;
+ QMetaObject::invokeMethod(d->m_parser, [this, docsToBeUpdated]() {
+ d->m_parser->updateDocuments(docsToBeUpdated);
+ }, Qt::QueuedConnection);
+ });
+
connect(codeModelManager, &CppTools::CppModelManager::aboutToRemoveFiles,
d->m_parser, &Parser::removeFiles, Qt::QueuedConnection);
}
@@ -295,12 +330,7 @@ void Manager::setState(bool state)
d->state = state;
if (state) // enabled - request a current snapshots etc?..
- resetParser();
-}
-
-void Manager::resetParser()
-{
- QMetaObject::invokeMethod(d->m_parser, &Parser::resetDataToCurrentState, Qt::QueuedConnection);
+ d->resetParser();
}
/*!