Android: Run Process asynchronously from the main thread

Instead of running it blocking from a separate thread.

Change-Id: Ia971395faf7d34062ab4bcfa91082c0bf77cdccf
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-05-03 10:29:35 +02:00
parent 5af69018f6
commit d356257bd6
4 changed files with 20 additions and 48 deletions

View File

@@ -11,7 +11,6 @@
#include <solutions/tasking/tasktreerunner.h> #include <solutions/tasking/tasktreerunner.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/async.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <utils/outputformatter.h> #include <utils/outputformatter.h>
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
@@ -27,7 +26,6 @@
namespace { namespace {
Q_LOGGING_CATEGORY(sdkManagerLog, "qtc.android.sdkManager", QtWarningMsg) Q_LOGGING_CATEGORY(sdkManagerLog, "qtc.android.sdkManager", QtWarningMsg)
const char commonArgsKey[] = "Common Arguments:";
} }
using namespace Tasking; using namespace Tasking;
@@ -498,31 +496,6 @@ static bool sdkManagerCommand(const AndroidConfig &config, const QStringList &ar
return proc.result() == ProcessResult::FinishedWithSuccess; return proc.result() == ProcessResult::FinishedWithSuccess;
} }
static void parseCommonArguments(QPromise<QString> &promise)
{
QString argumentDetails;
QString output;
sdkManagerCommand(androidConfig(), QStringList("--help"), &output);
bool foundTag = false;
const auto lines = output.split('\n');
for (const QString& line : lines) {
if (promise.isCanceled())
break;
if (foundTag)
argumentDetails.append(line + "\n");
else if (line.startsWith(commonArgsKey))
foundTag = true;
}
if (!promise.isCanceled())
promise.addResult(argumentDetails);
}
QFuture<QString> AndroidSdkManager::availableArguments() const
{
return Utils::asyncRun(parseCommonArguments);
}
AndroidSdkManagerPrivate::AndroidSdkManagerPrivate(AndroidSdkManager &sdkManager) AndroidSdkManagerPrivate::AndroidSdkManagerPrivate(AndroidSdkManager &sdkManager)
: m_sdkManager(sdkManager) : m_sdkManager(sdkManager)
{} {}

View File

@@ -7,7 +7,6 @@
#include <utils/filepath.h> #include <utils/filepath.h>
#include <QObject> #include <QObject>
#include <QFuture>
#include <memory> #include <memory>
@@ -55,8 +54,6 @@ public:
bool packageListingSuccessful() const; bool packageListingSuccessful() const;
QFuture<QString> availableArguments() const;
void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {}); void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
void runUpdate(); void runUpdate();

View File

@@ -7,7 +7,6 @@
#include "androidsdkmodel.h" #include "androidsdkmodel.h"
#include "androidtr.h" #include "androidtr.h"
#include <utils/async.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -270,16 +269,24 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a
m_argumentDetailsEdit = new QPlainTextEdit(this); m_argumentDetailsEdit = new QPlainTextEdit(this);
m_argumentDetailsEdit->setReadOnly(true); m_argumentDetailsEdit->setReadOnly(true);
auto populateOptions = [this](const QString& options) { m_process.setEnvironment(androidConfig().toolsEnvironment());
if (options.isEmpty()) { m_process.setCommand({androidConfig().sdkManagerToolPath(),
m_argumentDetailsEdit->setPlainText(Tr::tr("Cannot load available arguments for " {"--help", "--sdk_root=" + androidConfig().sdkLocation().toString()}});
"\"sdkmanager\" command.")); connect(&m_process, &Process::done, this, [this] {
} else { QString argumentDetails;
m_argumentDetailsEdit->setPlainText(options); bool foundTag = false;
const QStringList lines = m_process.allOutput().split('\n');
for (const QString &line : lines) {
if (foundTag)
argumentDetails.append(line + "\n");
else if (line.startsWith("Common Arguments:"))
foundTag = true;
} }
}; if (argumentDetails.isEmpty())
m_optionsFuture = sdkManager->availableArguments(); argumentDetails = Tr::tr("Cannot load available arguments for \"sdkmanager\" command.");
Utils::onResultReady(m_optionsFuture, this, populateOptions); m_argumentDetailsEdit->setPlainText(argumentDetails);
});
m_process.start();
auto dialogButtons = new QDialogButtonBox(this); auto dialogButtons = new QDialogButtonBox(this);
dialogButtons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); dialogButtons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
@@ -298,12 +305,6 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a
}.attachTo(this); }.attachTo(this);
} }
OptionsDialog::~OptionsDialog()
{
m_optionsFuture.cancel();
m_optionsFuture.waitForFinished();
}
QStringList OptionsDialog::sdkManagerArguments() const QStringList OptionsDialog::sdkManagerArguments() const
{ {
QString userInput = m_argumentsEdit->text().simplified(); QString userInput = m_argumentsEdit->text().simplified();

View File

@@ -4,6 +4,8 @@
#include "androidsdkmanager.h" #include "androidsdkmanager.h"
#include <utils/qtcprocess.h>
#include <QDialog> #include <QDialog>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -23,14 +25,13 @@ class OptionsDialog : public QDialog
{ {
public: public:
OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, QWidget *parent = nullptr); OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, QWidget *parent = nullptr);
~OptionsDialog() override;
QStringList sdkManagerArguments() const; QStringList sdkManagerArguments() const;
private: private:
QPlainTextEdit *m_argumentDetailsEdit = nullptr; QPlainTextEdit *m_argumentDetailsEdit = nullptr;
QLineEdit *m_argumentsEdit = nullptr; QLineEdit *m_argumentsEdit = nullptr;
QFuture<QString> m_optionsFuture; Utils::Process m_process;
}; };
class AndroidSdkManagerWidget : public QDialog class AndroidSdkManagerWidget : public QDialog