Implement ProcessLauncherImpl::waitFor*() methods

Change-Id: I68b77300e77701e527079cecee4d92411f15be14
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2021-07-13 15:53:35 +02:00
parent a0857706c0
commit 10668b39ce
2 changed files with 57 additions and 7 deletions

View File

@@ -277,6 +277,7 @@ private:
class ProcessLauncherImpl : public ProcessInterface class ProcessLauncherImpl : public ProcessInterface
{ {
Q_OBJECT
public: public:
ProcessLauncherImpl() : ProcessInterface() ProcessLauncherImpl() : ProcessInterface()
{ {
@@ -320,9 +321,9 @@ public:
QString errorString() const override { return m_errorString; } QString errorString() const override { return m_errorString; }
void setErrorString(const QString &str) override { m_errorString = str; } void setErrorString(const QString &str) override { m_errorString = str; }
bool waitForStarted(int msecs) override { QTC_CHECK(false); return false; } bool waitForStarted(int msecs) override;
bool waitForReadyRead(int msecs) override { QTC_CHECK(false); return false; } bool waitForReadyRead(int msecs) override;
bool waitForFinished(int msecs) override { QTC_CHECK(false); return false; } bool waitForFinished(int msecs) override;
void setLowPriority() override { QTC_CHECK(false); } void setLowPriority() override { QTC_CHECK(false); }
bool lowPriority() const override { QTC_CHECK(false); return false; } bool lowPriority() const override { QTC_CHECK(false); return false; }
@@ -336,7 +337,15 @@ public:
void setNativeArguments(const QString &arguments) override { QTC_CHECK(false); } void setNativeArguments(const QString &arguments) override { QTC_CHECK(false); }
#endif #endif
signals:
void preStarted();
void preReadyRead();
void preFinished();
private: private:
typedef void (ProcessLauncherImpl::*PreSignal)(void);
bool waitForSignal(int msecs, const PreSignal &preSignal);
void doStart(); void doStart();
void cancel(); void cancel();
void sendPacket(const Internal::LauncherPacket &packet) void sendPacket(const Internal::LauncherPacket &packet)
@@ -374,6 +383,42 @@ private:
bool m_socketError = false; bool m_socketError = false;
}; };
bool ProcessLauncherImpl::waitForStarted(int msecs)
{
if (m_state == QProcess::Running)
return true;
return waitForSignal(msecs, &ProcessLauncherImpl::preStarted);
}
bool ProcessLauncherImpl::waitForReadyRead(int msecs)
{
// TODO: check if any data is ready, return true if there is data
return waitForSignal(msecs, &ProcessLauncherImpl::preReadyRead);
}
bool ProcessLauncherImpl::waitForFinished(int msecs)
{
if (m_state == QProcess::NotRunning)
return true;
return waitForSignal(msecs, &ProcessLauncherImpl::preFinished);
}
bool ProcessLauncherImpl::waitForSignal(int msecs, const PreSignal &preSignal)
{
if (m_canceled)
return false;
bool ok = false;
QEventLoop loop;
QTimer::singleShot(msecs, &loop, &QEventLoop::quit);
connect(this, preSignal, &loop, [&loop, &ok]() {
ok = true;
loop.quit();
});
loop.exec(QEventLoop::ExcludeUserInputEvents);
return ok;
}
void ProcessLauncherImpl::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode) void ProcessLauncherImpl::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode)
{ {
// TODO: pass the open mode to StartProcessPacket // TODO: pass the open mode to StartProcessPacket
@@ -481,6 +526,7 @@ void ProcessLauncherImpl::handleStartedPacket(const QByteArray &packetData)
m_state = QProcess::Running; m_state = QProcess::Running;
const auto packet = LauncherPacket::extractPacket<ProcessStartedPacket>(token(), packetData); const auto packet = LauncherPacket::extractPacket<ProcessStartedPacket>(token(), packetData);
m_processId = packet.processId; m_processId = packet.processId;
emit preStarted();
emit started(); emit started();
} }
@@ -494,11 +540,16 @@ void ProcessLauncherImpl::handleFinishedPacket(const QByteArray &packetData)
m_exitCode = packet.exitCode; m_exitCode = packet.exitCode;
m_stdout = packet.stdOut; m_stdout = packet.stdOut;
m_stderr = packet.stdErr; m_stderr = packet.stdErr;
if (!m_stdout.isEmpty()) if (!m_stdout.isEmpty()) {
emit preReadyRead();
emit readyReadStandardOutput(); emit readyReadStandardOutput();
if (!m_stderr.isEmpty()) }
if (!m_stderr.isEmpty()) {
emit preReadyRead();
emit readyReadStandardError(); emit readyReadStandardError();
}
m_errorString = packet.errorString; m_errorString = packet.errorString;
emit preFinished();
emit finished(m_exitCode, packet.exitStatus); emit finished(m_exitCode, packet.exitStatus);
} }
@@ -847,8 +898,6 @@ bool QtcProcess::stopProcess()
if (state() == QProcess::NotRunning) if (state() == QProcess::NotRunning)
return true; return true;
terminate(); terminate();
if (state() == QProcess::NotRunning)
return true;
if (waitForFinished(300)) if (waitForFinished(300))
return true; return true;
kill(); kill();

View File

@@ -232,6 +232,7 @@ void LauncherSocketHandler::handleStartPacket()
process->setWorkingDirectory(packet.workingDir); process->setWorkingDirectory(packet.workingDir);
process->setProcessChannelMode(packet.mode); process->setProcessChannelMode(packet.mode);
process->start(packet.command, packet.arguments); process->start(packet.command, packet.arguments);
process->closeWriteChannel();
} }
void LauncherSocketHandler::handleStopPacket() void LauncherSocketHandler::handleStopPacket()