forked from qt-creator/qt-creator
Pipe readyRead() through the CallerHandle
In this way the output and error channels get handled while waitingFor* is being executed. Change-Id: I8d3d81bd99fcfb7ddea7e98337e859446380055f Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -42,6 +42,7 @@ public:
|
|||||||
|
|
||||||
enum class SignalType {
|
enum class SignalType {
|
||||||
Started,
|
Started,
|
||||||
|
ReadyRead,
|
||||||
Finished
|
Finished
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -59,6 +60,9 @@ public:
|
|||||||
case SignalType::Started:
|
case SignalType::Started:
|
||||||
emit started();
|
emit started();
|
||||||
break;
|
break;
|
||||||
|
case SignalType::ReadyRead:
|
||||||
|
emit readyRead();
|
||||||
|
break;
|
||||||
case SignalType::Finished:
|
case SignalType::Finished:
|
||||||
emit finished();
|
emit finished();
|
||||||
break;
|
break;
|
||||||
@@ -68,6 +72,7 @@ public:
|
|||||||
void appendSignal(SignalType signalType) { QMutexLocker locker(&m_mutex); m_signals.append(signalType); }
|
void appendSignal(SignalType signalType) { QMutexLocker locker(&m_mutex); m_signals.append(signalType); }
|
||||||
signals:
|
signals:
|
||||||
void started();
|
void started();
|
||||||
|
void readyRead();
|
||||||
void finished();
|
void finished();
|
||||||
private:
|
private:
|
||||||
QMutex m_mutex;
|
QMutex m_mutex;
|
||||||
@@ -161,13 +166,11 @@ void LauncherHandle::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())
|
|
||||||
emit readyReadStandardOutput();
|
|
||||||
if (!m_stderr.isEmpty())
|
|
||||||
emit readyReadStandardError();
|
|
||||||
m_errorString = packet.errorString;
|
m_errorString = packet.errorString;
|
||||||
m_exitStatus = packet.exitStatus;
|
m_exitStatus = packet.exitStatus;
|
||||||
if (m_callerHandle) {
|
if (m_callerHandle) {
|
||||||
|
if (!m_stdout.isEmpty() || !m_stderr.isEmpty())
|
||||||
|
m_callerHandle->appendSignal(CallerHandle::SignalType::ReadyRead);
|
||||||
m_callerHandle->appendSignal(CallerHandle::SignalType::Finished);
|
m_callerHandle->appendSignal(CallerHandle::SignalType::Finished);
|
||||||
flushCaller();
|
flushCaller();
|
||||||
}
|
}
|
||||||
@@ -270,6 +273,7 @@ void LauncherHandle::createCallerHandle()
|
|||||||
QTC_CHECK(m_callerHandle == nullptr);
|
QTC_CHECK(m_callerHandle == nullptr);
|
||||||
m_callerHandle = new CallerHandle();
|
m_callerHandle = new CallerHandle();
|
||||||
connect(m_callerHandle, &CallerHandle::started, this, &LauncherHandle::slotStarted, Qt::DirectConnection);
|
connect(m_callerHandle, &CallerHandle::started, this, &LauncherHandle::slotStarted, Qt::DirectConnection);
|
||||||
|
connect(m_callerHandle, &CallerHandle::readyRead, this, &LauncherHandle::slotReadyRead, Qt::DirectConnection);
|
||||||
connect(m_callerHandle, &CallerHandle::finished, this, &LauncherHandle::slotFinished, Qt::DirectConnection);
|
connect(m_callerHandle, &CallerHandle::finished, this, &LauncherHandle::slotFinished, Qt::DirectConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,6 +290,21 @@ void LauncherHandle::slotStarted()
|
|||||||
emit started();
|
emit started();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LauncherHandle::slotReadyRead()
|
||||||
|
{
|
||||||
|
bool hasOutput = false;
|
||||||
|
bool hasError = false;
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
hasOutput = !m_stdout.isEmpty();
|
||||||
|
hasError = !m_stderr.isEmpty();
|
||||||
|
}
|
||||||
|
if (hasOutput)
|
||||||
|
emit readyReadStandardOutput();
|
||||||
|
if (hasError)
|
||||||
|
emit readyReadStandardError();
|
||||||
|
}
|
||||||
|
|
||||||
void LauncherHandle::slotFinished()
|
void LauncherHandle::slotFinished()
|
||||||
{
|
{
|
||||||
int exitCode = 0;
|
int exitCode = 0;
|
||||||
|
@@ -121,6 +121,7 @@ private:
|
|||||||
void doStart();
|
void doStart();
|
||||||
|
|
||||||
void slotStarted();
|
void slotStarted();
|
||||||
|
void slotReadyRead();
|
||||||
void slotFinished();
|
void slotFinished();
|
||||||
|
|
||||||
// called from this thread
|
// called from this thread
|
||||||
|
Reference in New Issue
Block a user