QmlDbg: Don't wait infinitely for messages on application output

We only connect to the port when we get a 'Waiting for connection ...'
message on application output. This was done mainly to avoid lots
of failed connects, and therefore an unresponsive UI on Windows.

However, the application output might be redirected for various reasons.
Therefore fall back to busy connect after a certain time (4 seconds
for profiling, 8 seconds for debugging).

Change-Id: Ie1b943f678ced40c030cc134493a2adf7e3bc9df
Reviewed-on: http://codereview.qt.nokia.com/2323
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Christiaan Janssen <christiaan.janssen@nokia.com>
This commit is contained in:
Kai Koehne
2011-07-28 10:38:39 +02:00
parent 52d2987e50
commit 7aaab4d050
4 changed files with 42 additions and 5 deletions

View File

@@ -54,6 +54,7 @@
#include <QtGui/QMainWindow>
#include <QtGui/QMessageBox>
#include <QtCore/QTimer>
using namespace Analyzer;
using namespace ProjectExplorer;
@@ -83,6 +84,7 @@ public:
bool m_fetchingData;
bool m_fetchDataFromStart;
bool m_delayedDelete;
QTimer m_noDebugOutputTimer;
};
AbstractQmlProfilerRunner *
@@ -135,6 +137,12 @@ QmlProfilerEngine::QmlProfilerEngine(IAnalyzerTool *tool,
d->m_fetchingData = false;
d->m_fetchDataFromStart = false;
d->m_delayedDelete = false;
// Only wait 4 seconds for the 'Waiting for connection' on application ouput, then just try to connect
// (application output might be redirected / blocked)
d->m_noDebugOutputTimer.setSingleShot(true);
d->m_noDebugOutputTimer.setInterval(4000);
connect(&d->m_noDebugOutputTimer, SIGNAL(timeout()), this, SLOT(processIsRunning()));
}
QmlProfilerEngine::~QmlProfilerEngine()
@@ -174,6 +182,7 @@ bool QmlProfilerEngine::start()
connect(d->m_runner, SIGNAL(appendMessage(QString,Utils::OutputFormat)),
this, SLOT(logApplicationMessage(QString,Utils::OutputFormat)));
d->m_noDebugOutputTimer.start();
d->m_runner->start();
d->m_running = true;
@@ -248,6 +257,9 @@ void QmlProfilerEngine::filterApplicationMessage(const QString &msg)
const int index = msg.indexOf(qddserver);
if (index != -1) {
// we're actually getting debug output
d->m_noDebugOutputTimer.stop();
QString status = msg;
status.remove(0, index + qddserver.length()); // chop of 'QDeclarativeDebugServer: '
@@ -259,7 +271,7 @@ void QmlProfilerEngine::filterApplicationMessage(const QString &msg)
QString errorMessage;
if (status.startsWith(waitingForConnection)) {
emit processRunning(d->m_runner->debugPort());
processIsRunning();
} else if (status.startsWith(unableToListen)) {
//: Error message shown after 'Could not connect ... debugger:"
errorMessage = tr("The port seems to be in use.");
@@ -291,7 +303,7 @@ void QmlProfilerEngine::filterApplicationMessage(const QString &msg)
}
} else if (msg.contains(cannotRetrieveDebuggingOutput)) {
// we won't get debugging output, so just try to connect ...
emit processRunning(d->m_runner->debugPort());
processIsRunning();
}
}
@@ -323,5 +335,11 @@ void QmlProfilerEngine::showNonmodalWarning(const QString &warningMsg)
noExecWarning->show();
}
void QmlProfilerEngine::processIsRunning()
{
d->m_noDebugOutputTimer.stop();
emit processRunning(d->m_runner->debugPort());
}
} // namespace Internal
} // namespace QmlProfiler