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 {
|
||||
Started,
|
||||
ReadyRead,
|
||||
Finished
|
||||
};
|
||||
|
||||
@@ -59,6 +60,9 @@ public:
|
||||
case SignalType::Started:
|
||||
emit started();
|
||||
break;
|
||||
case SignalType::ReadyRead:
|
||||
emit readyRead();
|
||||
break;
|
||||
case SignalType::Finished:
|
||||
emit finished();
|
||||
break;
|
||||
@@ -68,6 +72,7 @@ public:
|
||||
void appendSignal(SignalType signalType) { QMutexLocker locker(&m_mutex); m_signals.append(signalType); }
|
||||
signals:
|
||||
void started();
|
||||
void readyRead();
|
||||
void finished();
|
||||
private:
|
||||
QMutex m_mutex;
|
||||
@@ -161,13 +166,11 @@ void LauncherHandle::handleFinishedPacket(const QByteArray &packetData)
|
||||
m_exitCode = packet.exitCode;
|
||||
m_stdout = packet.stdOut;
|
||||
m_stderr = packet.stdErr;
|
||||
if (!m_stdout.isEmpty())
|
||||
emit readyReadStandardOutput();
|
||||
if (!m_stderr.isEmpty())
|
||||
emit readyReadStandardError();
|
||||
m_errorString = packet.errorString;
|
||||
m_exitStatus = packet.exitStatus;
|
||||
if (m_callerHandle) {
|
||||
if (!m_stdout.isEmpty() || !m_stderr.isEmpty())
|
||||
m_callerHandle->appendSignal(CallerHandle::SignalType::ReadyRead);
|
||||
m_callerHandle->appendSignal(CallerHandle::SignalType::Finished);
|
||||
flushCaller();
|
||||
}
|
||||
@@ -270,6 +273,7 @@ void LauncherHandle::createCallerHandle()
|
||||
QTC_CHECK(m_callerHandle == nullptr);
|
||||
m_callerHandle = new CallerHandle();
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -286,6 +290,21 @@ void LauncherHandle::slotStarted()
|
||||
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()
|
||||
{
|
||||
int exitCode = 0;
|
||||
|
@@ -121,6 +121,7 @@ private:
|
||||
void doStart();
|
||||
|
||||
void slotStarted();
|
||||
void slotReadyRead();
|
||||
void slotFinished();
|
||||
|
||||
// called from this thread
|
||||
|
Reference in New Issue
Block a user