QmlProfilerTool: Move parts of finalizeRunControl into QmlProfilerRunner

Hide QmlProfilerRunner::cancelProcess().
Pass RunControl into finalizeRunControl, instead of QmlProfilerRunner.

Change-Id: I3f57a8d80a6261bb5692715c0251a600d35b54ae
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2025-01-06 13:27:29 +01:00
parent b404aa8c06
commit 25d6dcc7be
4 changed files with 67 additions and 72 deletions

View File

@@ -3,8 +3,10 @@
#include "qmlprofilerruncontrol.h"
#include "qmlprofilerclientmanager.h"
#include "qmlprofilerstatemanager.h"
#include "qmlprofilertool.h"
#include "qmlprofilertr.h"
#include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h>
@@ -24,6 +26,8 @@
#include <utils/qtcassert.h>
#include <utils/url.h>
#include <QMessageBox>
using namespace Core;
using namespace ProjectExplorer;
@@ -63,7 +67,7 @@ void QmlProfilerRunner::start()
if (d->m_profilerState)
disconnect(d->m_profilerState, &QmlProfilerStateManager::stateChanged, this, nullptr);
QmlProfilerTool::instance()->finalizeRunControl(this);
QmlProfilerTool::instance()->finalizeRunControl(runControl());
connect(this, &QmlProfilerRunner::stopped,
QmlProfilerTool::instance(), &QmlProfilerTool::handleStop);
d->m_profilerState = QmlProfilerTool::instance()->stateManager();
@@ -73,6 +77,66 @@ void QmlProfilerRunner::start()
if (d->m_profilerState->currentState() == QmlProfilerStateManager::Idle)
reportStopped();
});
QmlProfilerClientManager *clientManager = QmlProfilerTool::instance()->clientManager();
connect(clientManager, &QmlProfilerClientManager::connectionFailed, this, [this, clientManager] {
auto infoBox = new QMessageBox(ICore::dialogParent());
infoBox->setIcon(QMessageBox::Critical);
infoBox->setWindowTitle(QGuiApplication::applicationDisplayName());
const int interval = clientManager->retryInterval();
const int retries = clientManager->maximumRetries();
infoBox->setText(Tr::tr("Could not connect to the in-process QML profiler "
"within %1 s.\n"
"Do you want to retry and wait %2 s?")
.arg(interval * retries / 1000.0)
.arg(interval * 2 * retries / 1000.0));
infoBox->setStandardButtons(QMessageBox::Retry | QMessageBox::Cancel | QMessageBox::Help);
infoBox->setDefaultButton(QMessageBox::Retry);
infoBox->setModal(true);
connect(infoBox, &QDialog::finished, this, [this, clientManager, interval](int result) {
const auto cancelProcess = [this] {
QTC_ASSERT(d->m_profilerState, return);
switch (d->m_profilerState->currentState()) {
case QmlProfilerStateManager::Idle:
break;
case QmlProfilerStateManager::AppRunning:
d->m_profilerState->setCurrentState(QmlProfilerStateManager::AppDying);
break;
default: {
const QString message = QString::fromLatin1("Unexpected process termination requested with state %1 in %2:%3")
.arg(d->m_profilerState->currentStateAsString(), QString::fromLatin1(__FILE__), QString::number(__LINE__));
qWarning("%s", qPrintable(message));
return;
}
}
runControl()->initiateStop();
};
switch (result) {
case QMessageBox::Retry:
clientManager->setRetryInterval(interval * 2);
clientManager->retryConnect();
break;
case QMessageBox::Help:
HelpManager::showHelpUrl(
"qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html");
Q_FALLTHROUGH();
case QMessageBox::Cancel:
// The actual error message has already been logged.
QmlProfilerTool::logState(Tr::tr("Failed to connect."));
cancelProcess();
break;
}
});
infoBox->show();
}, Qt::QueuedConnection); // Queue any connection failures after reportStarted()
clientManager->connectToServer(runControl()->qmlChannel());
reportStarted();
}
@@ -105,26 +169,6 @@ void QmlProfilerRunner::stop()
}
}
void QmlProfilerRunner::cancelProcess()
{
QTC_ASSERT(d->m_profilerState, return);
switch (d->m_profilerState->currentState()) {
case QmlProfilerStateManager::Idle:
break;
case QmlProfilerStateManager::AppRunning:
d->m_profilerState->setCurrentState(QmlProfilerStateManager::AppDying);
break;
default: {
const QString message = QString::fromLatin1("Unexpected process termination requested with state %1 in %2:%3")
.arg(d->m_profilerState->currentStateAsString(), QString::fromLatin1(__FILE__), QString::number(__LINE__));
qWarning("%s", qPrintable(message));
return;
}
}
runControl()->initiateStop();
}
RunWorker *createLocalQmlProfilerWorker(RunControl *runControl)
{
auto worker = new ProcessRunner(runControl);

View File

@@ -20,8 +20,6 @@ public:
QmlProfilerRunner(ProjectExplorer::RunControl *runControl);
~QmlProfilerRunner() override;
void cancelProcess();
private:
void start() override;
void stop() override;

View File

@@ -350,10 +350,9 @@ void QmlProfilerTool::updateRunActions()
}
}
void QmlProfilerTool::finalizeRunControl(QmlProfilerRunner *runWorker)
void QmlProfilerTool::finalizeRunControl(RunControl *runControl)
{
d->m_toolBusy = true;
auto runControl = runWorker->runControl();
if (auto aspect = runControl->aspectData<QmlProfilerRunConfigurationAspect>()) {
if (auto settings = static_cast<const QmlProfilerSettings *>(aspect->currentSettings)) {
d->m_profilerConnections->setFlushInterval(settings->flushEnabled() ?
@@ -366,52 +365,7 @@ void QmlProfilerTool::finalizeRunControl(QmlProfilerRunner *runWorker)
updateRunActions();
//
// Initialize m_projectFinder
//
d->m_profilerModelManager->populateFileFinder(runControl->target());
connect(d->m_profilerConnections, &QmlProfilerClientManager::connectionFailed,
runWorker, [this, runWorker] {
auto infoBox = new QMessageBox(ICore::dialogParent());
infoBox->setIcon(QMessageBox::Critical);
infoBox->setWindowTitle(QGuiApplication::applicationDisplayName());
const int interval = d->m_profilerConnections->retryInterval();
const int retries = d->m_profilerConnections->maximumRetries();
infoBox->setText(Tr::tr("Could not connect to the in-process QML profiler "
"within %1 s.\n"
"Do you want to retry and wait %2 s?")
.arg(interval * retries / 1000.0)
.arg(interval * 2 * retries / 1000.0));
infoBox->setStandardButtons(QMessageBox::Retry | QMessageBox::Cancel | QMessageBox::Help);
infoBox->setDefaultButton(QMessageBox::Retry);
infoBox->setModal(true);
connect(infoBox, &QDialog::finished, runWorker, [this, runWorker, interval](int result) {
switch (result) {
case QMessageBox::Retry:
d->m_profilerConnections->setRetryInterval(interval * 2);
d->m_profilerConnections->retryConnect();
break;
case QMessageBox::Help:
HelpManager::showHelpUrl(
"qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html");
Q_FALLTHROUGH();
case QMessageBox::Cancel:
// The actual error message has already been logged.
QmlProfilerTool::logState(Tr::tr("Failed to connect."));
runWorker->cancelProcess();
break;
}
});
infoBox->show();
}, Qt::QueuedConnection); // Queue any connection failures after reportStarted()
d->m_profilerConnections->connectToServer(runControl->qmlChannel());
d->m_profilerState->setCurrentState(QmlProfilerStateManager::AppRunning);
}

View File

@@ -17,7 +17,6 @@ class QmlProfilerStateManager;
namespace Internal {
class QmlProfilerRunner;
class QmlProfilerClientManager;
class QMLPROFILER_EXPORT QmlProfilerTool : public QObject
@@ -30,7 +29,7 @@ public:
static QmlProfilerTool *instance();
void finalizeRunControl(QmlProfilerRunner *runWorker);
void finalizeRunControl(ProjectExplorer::RunControl *runControl);
void handleStop();
bool prepareTool();