diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 20daa2471662723c0644e299f6240107a22e5bbf..11d29e5447c5cb4c9ba3900773f7edab60d20b2e 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -164,6 +164,7 @@ private: QmlAdapter m_adapter; ApplicationLauncher m_applicationLauncher; Utils::FileInProjectFinder fileFinder; + QTimer m_noDebugOutputTimer; }; QmlEnginePrivate::QmlEnginePrivate(QmlEngine *q) @@ -203,6 +204,12 @@ QmlEngine::QmlEngine(const DebuggerStartParameters &startParameters, connect(&d->m_applicationLauncher, SIGNAL(appendMessage(QString,Utils::OutputFormat)), SLOT(appendMessage(QString,Utils::OutputFormat))); + +// Only wait 8 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(8000); + connect(&d->m_noDebugOutputTimer, SIGNAL(timeout()), this, SLOT(beginConnection())); } QmlEngine::~QmlEngine() @@ -251,6 +258,12 @@ void QmlEngine::connectionEstablished() notifyEngineRunAndInferiorRunOk(); } +void QmlEngine::beginConnection() +{ + d->m_noDebugOutputTimer.stop(); + d->m_adapter.beginConnection(); +} + void QmlEngine::connectionStartupFailed() { Core::ICore * const core = Core::ICore::instance(); @@ -273,7 +286,7 @@ void QmlEngine::retryMessageBoxFinished(int result) { switch (result) { case QMessageBox::Retry: { - d->m_adapter.beginConnection(); + beginConnection(); break; } case QMessageBox::Help: { @@ -311,6 +324,9 @@ void QmlEngine::filterApplicationMessage(const QString &msg, int /*channel*/) 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: ' @@ -322,7 +338,7 @@ void QmlEngine::filterApplicationMessage(const QString &msg, int /*channel*/) QString errorMessage; if (status.startsWith(waitingForConnection)) { - d->m_adapter.beginConnection(); + beginConnection(); } else if (status.startsWith(unableToListen)) { //: Error message shown after 'Could not connect ... debugger:" errorMessage = tr("The port seems to be in use."); @@ -356,7 +372,7 @@ void QmlEngine::filterApplicationMessage(const QString &msg, int /*channel*/) } } else if (msg.contains(cannotRetrieveDebuggingOutput)) { // we won't get debugging output, so just try to connect ... - d->m_adapter.beginConnection(); + beginConnection(); } } @@ -385,6 +401,7 @@ void QmlEngine::runEngine() if (!isSlaveEngine() && startParameters().startMode != AttachToRemote) startApplicationLauncher(); + d->m_noDebugOutputTimer.start(); } void QmlEngine::startApplicationLauncher() diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h index 9dd2b82e219dc3006b2bc3eac94b7db4f170a5c0..6328823216e5f06cac3e83bf467fcec7bd4d5bb8 100644 --- a/src/plugins/debugger/qml/qmlengine.h +++ b/src/plugins/debugger/qml/qmlengine.h @@ -126,6 +126,7 @@ signals: TextEditor::ITextEditor *editor, int cursorPos); private slots: + void beginConnection(); void connectionEstablished(); void connectionStartupFailed(); void connectionError(QAbstractSocket::SocketError error); diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp index 402f32c70ac1d734093870fd796cc89282854041..931afd81a29c40cfc2fff560b00a5f54a316a435 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp @@ -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 diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.h b/src/plugins/qmlprofiler/qmlprofilerengine.h index 9b215be1370a47d8be3b68d1dbb96c152b88c3c3..359ba8ebe86492c5d1c03ff5a37d529230a271ca 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.h +++ b/src/plugins/qmlprofiler/qmlprofilerengine.h @@ -66,6 +66,7 @@ private slots: void logApplicationMessage(const QString &msg, Utils::OutputFormat format); void filterApplicationMessage(const QString &msg); void wrongSetupMessageBoxFinished(int); + void processIsRunning(); private: class QmlProfilerEnginePrivate;