forked from qt-creator/qt-creator
WinDebugInterface: Flush messages on being stopped
I found this while investigating a bug report. Change-Id: Ic756dfc4b1dfe1b1a647d5b10441391c97046176 Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
This commit is contained in:
@@ -144,21 +144,27 @@ bool WinDebugInterface::runLoop()
|
|||||||
|
|
||||||
QMap<qint64, QString> delayedMessages;
|
QMap<qint64, QString> delayedMessages;
|
||||||
|
|
||||||
|
auto flushMessages = [&delayedMessages](){
|
||||||
|
auto it = delayedMessages.constBegin();
|
||||||
|
auto end = delayedMessages.constEnd();
|
||||||
|
for (; it != end; ++it)
|
||||||
|
emit debugOutput(it.key(), it.value());
|
||||||
|
delayedMessages.clear();
|
||||||
|
timer.start();
|
||||||
|
};
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
DWORD timeout = INFINITE;
|
DWORD timeout = INFINITE;
|
||||||
if (!delayedMessages.isEmpty()) // if we have delayed message, don't wait forever
|
if (!delayedMessages.isEmpty()) // if we have delayed message, don't wait forever
|
||||||
timeout = qMax(60 - timer.elapsed(), 1);
|
timeout = qMax(60 - timer.elapsed(), 1);
|
||||||
const DWORD ret = WaitForMultipleObjects(HandleCount, m_waitHandles, FALSE, timeout);
|
const DWORD ret = WaitForMultipleObjects(HandleCount, m_waitHandles, FALSE, timeout);
|
||||||
|
|
||||||
if (ret == WAIT_FAILED || ret - WAIT_OBJECT_0 == TerminateEventHandle)
|
if (ret == WAIT_FAILED || ret - WAIT_OBJECT_0 == TerminateEventHandle) {
|
||||||
|
flushMessages();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
if (ret == WAIT_TIMEOUT) {
|
if (ret == WAIT_TIMEOUT) {
|
||||||
auto it = delayedMessages.constBegin();
|
flushMessages();
|
||||||
auto end = delayedMessages.constEnd();
|
|
||||||
for (; it != end; ++it)
|
|
||||||
emit debugOutput(it.key(), it.value());
|
|
||||||
delayedMessages.clear();
|
|
||||||
timer.start();
|
|
||||||
SetEvent(m_bufferReadyEvent);
|
SetEvent(m_bufferReadyEvent);
|
||||||
} else if (ret - WAIT_OBJECT_0 == DataReadyEventHandle) {
|
} else if (ret - WAIT_OBJECT_0 == DataReadyEventHandle) {
|
||||||
if (*processId != m_creatorPid) {
|
if (*processId != m_creatorPid) {
|
||||||
@@ -166,12 +172,7 @@ bool WinDebugInterface::runLoop()
|
|||||||
delayedMessages[*processId].append(QString::fromLocal8Bit(message));
|
delayedMessages[*processId].append(QString::fromLocal8Bit(message));
|
||||||
} else {
|
} else {
|
||||||
delayedMessages[*processId] += QString::fromLocal8Bit(message);
|
delayedMessages[*processId] += QString::fromLocal8Bit(message);
|
||||||
auto it = delayedMessages.constBegin();
|
flushMessages();
|
||||||
auto end = delayedMessages.constEnd();
|
|
||||||
for (; it != end; ++it)
|
|
||||||
emit debugOutput(it.key(), it.value());
|
|
||||||
delayedMessages.clear();
|
|
||||||
timer.start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetEvent(m_bufferReadyEvent);
|
SetEvent(m_bufferReadyEvent);
|
||||||
|
|||||||
Reference in New Issue
Block a user