From ff6e100824fcc90c1d25d70fdd7d4143d1821bd1 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 26 Feb 2013 11:15:38 +0100 Subject: [PATCH] C++: prevent cloning the QTextDocument on the UI thread. Now the document contents (the text) is passed to the background thread, which in turn will recreate the text document. Change-Id: I7af47348fe162b53b8b440f1561a9919bf3c381a Reviewed-by: Nikolai Kosjar --- .../texteditor/codeassist/codeassistant.cpp | 6 ++++-- .../codeassist/defaultassistinterface.cpp | 18 ++++++++++++------ .../codeassist/defaultassistinterface.h | 6 ++++-- .../texteditor/codeassist/iassistinterface.h | 3 ++- src/plugins/texteditor/codeassist/runner.cpp | 1 + 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 84ad277c06..2616924ffc 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -132,6 +132,8 @@ private: // -------------------- const QChar CodeAssistantPrivate::m_null; +static const int AutomaticProposalTimerInterval = 400; + CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant) : m_q(assistant) , m_textEditor(0) @@ -142,7 +144,7 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant) , m_settings(TextEditorSettings::instance()->completionSettings()) { m_automaticProposalTimer.setSingleShot(true); - m_automaticProposalTimer.setInterval(400); + m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval); connect(&m_automaticProposalTimer, SIGNAL(timeout()), this, SLOT(automaticProposalTimeout())); connect(TextEditorSettings::instance(), @@ -248,7 +250,7 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason, m_requestRunner = new ProcessorRunner; connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed())); connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest())); - assistInterface->detach(m_requestRunner); + assistInterface->prepareForAsyncUse(); m_requestRunner->setReason(reason); m_requestRunner->setProcessor(processor); m_requestRunner->setAssistInterface(assistInterface); diff --git a/src/plugins/texteditor/codeassist/defaultassistinterface.cpp b/src/plugins/texteditor/codeassist/defaultassistinterface.cpp index f6fccae70c..325549db61 100644 --- a/src/plugins/texteditor/codeassist/defaultassistinterface.cpp +++ b/src/plugins/texteditor/codeassist/defaultassistinterface.cpp @@ -42,7 +42,7 @@ DefaultAssistInterface::DefaultAssistInterface(QTextDocument *textDocument, Core::IDocument *document, AssistReason reason) : m_textDocument(textDocument) - , m_detached(false) + , m_isAsync(false) , m_position(position) , m_document(document) , m_reason(reason) @@ -50,7 +50,7 @@ DefaultAssistInterface::DefaultAssistInterface(QTextDocument *textDocument, DefaultAssistInterface::~DefaultAssistInterface() { - if (m_detached) + if (m_isAsync) delete m_textDocument; } @@ -64,11 +64,17 @@ QString DefaultAssistInterface::textAt(int pos, int length) const return Convenience::textAt(QTextCursor(m_textDocument), pos, length); } -void DefaultAssistInterface::detach(QThread *destination) +void DefaultAssistInterface::prepareForAsyncUse() { - m_textDocument = m_textDocument->clone(); - m_textDocument->moveToThread(destination); - m_detached = true; + m_text = m_textDocument->toPlainText(); + m_textDocument = 0; + m_isAsync = true; +} + +void DefaultAssistInterface::recreateTextDocument() +{ + m_textDocument = new QTextDocument(m_text); + m_text = QString(); } AssistReason DefaultAssistInterface::reason() const diff --git a/src/plugins/texteditor/codeassist/defaultassistinterface.h b/src/plugins/texteditor/codeassist/defaultassistinterface.h index 27e72ac3ba..68ef4b7b51 100644 --- a/src/plugins/texteditor/codeassist/defaultassistinterface.h +++ b/src/plugins/texteditor/codeassist/defaultassistinterface.h @@ -48,15 +48,17 @@ public: virtual QString textAt(int position, int length) const; virtual const Core::IDocument *document() const { return m_document; } virtual QTextDocument *textDocument() const { return m_textDocument; } - virtual void detach(QThread *destination); + virtual void prepareForAsyncUse(); + virtual void recreateTextDocument(); virtual AssistReason reason() const; private: QTextDocument *m_textDocument; - bool m_detached; + bool m_isAsync; int m_position; Core::IDocument *m_document; AssistReason m_reason; + QString m_text; }; } // TextEditor diff --git a/src/plugins/texteditor/codeassist/iassistinterface.h b/src/plugins/texteditor/codeassist/iassistinterface.h index 50fdf0ab70..17d91681ac 100644 --- a/src/plugins/texteditor/codeassist/iassistinterface.h +++ b/src/plugins/texteditor/codeassist/iassistinterface.h @@ -58,7 +58,8 @@ public: virtual QString textAt(int position, int length) const = 0; virtual const Core::IDocument *document() const = 0; virtual QTextDocument *textDocument() const = 0; - virtual void detach(QThread *destination) = 0; + virtual void prepareForAsyncUse() = 0; + virtual void recreateTextDocument() = 0; virtual AssistReason reason() const = 0; }; diff --git a/src/plugins/texteditor/codeassist/runner.cpp b/src/plugins/texteditor/codeassist/runner.cpp index 494244eb97..b8d9dbfa4a 100644 --- a/src/plugins/texteditor/codeassist/runner.cpp +++ b/src/plugins/texteditor/codeassist/runner.cpp @@ -60,6 +60,7 @@ void ProcessorRunner::setProcessor(IAssistProcessor *computer) void ProcessorRunner::run() { + m_interface->recreateTextDocument(); m_proposal = m_processor->perform(m_interface); } -- GitLab