From bf3ba0f577f5d51ced6957a3ea3bb7c62d783668 Mon Sep 17 00:00:00 2001 From: BogDan Vatra <bogdan@kdab.com> Date: Mon, 7 Mar 2016 18:49:09 +0200 Subject: [PATCH] Don't create a QProcess object every second. Creating a QProcess every second is very VERY expensive, making the QtCreator UI experience pretty bad, the UI was not responsive when debugging or even when running an Android application from QtCreator. Thanks to Intel's VTUNE I could spot and fix the problem in minutes. Change-Id: I6d3dc71db93e91d9846101a1877bab017df41aba Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com> --- src/plugins/android/androidrunner.cpp | 17 +++++++++-------- src/plugins/android/androidrunner.h | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 237e850cfb5..80c49b55646 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -249,15 +249,13 @@ static int extractPid(const QString &exeName, const QByteArray &psOutput) QByteArray AndroidRunner::runPs() { - QProcess psProc; - QStringList args = m_selector; - args << _("shell") << _("ps"); + QByteArray psLine("ps"); if (m_isBusyBox) - args << _("-w"); - - psProc.start(m_adb, args); - psProc.waitForFinished(); - return psProc.readAll(); + psLine += " -w"; + psLine += '\n'; + m_psProc.write(psLine); + m_psProc.waitForBytesWritten(psLine.size()); + return m_psProc.readAllStandardOutput(); } void AndroidRunner::checkPID() @@ -322,6 +320,7 @@ void AndroidRunner::forceStop() void AndroidRunner::start() { m_adbLogcatProcess.start(m_adb, selector() << _("logcat")); + m_psProc.start(m_adb, selector() << _("shell")); Utils::runAsync(&AndroidRunner::asyncStart, this); } @@ -551,6 +550,8 @@ void AndroidRunner::stop() //QObject::disconnect(&m_adbLogcatProcess, 0, this, 0); m_adbLogcatProcess.kill(); m_adbLogcatProcess.waitForFinished(); + m_psProc.kill(); + m_psProc.waitForFinished(); foreach (const QStringList &entry, m_androidRunnable.afterFinishADBCommands) { QProcess adb; adb.start(m_adb, selector() << entry); diff --git a/src/plugins/android/androidrunner.h b/src/plugins/android/androidrunner.h index 84ae0c69ee3..32f7418ad9e 100644 --- a/src/plugins/android/androidrunner.h +++ b/src/plugins/android/androidrunner.h @@ -92,6 +92,7 @@ private: private: QProcess m_adbLogcatProcess; + QProcess m_psProc; QTimer m_checkPIDTimer; bool m_wasStarted; int m_tries; -- GitLab