forked from qt-creator/qt-creator
Implement ProcessLauncherImpl::waitFor*() methods
Change-Id: I68b77300e77701e527079cecee4d92411f15be14 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -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();
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user