diff options
author | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-02-10 20:29:54 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-02-26 16:19:11 +0000 |
commit | c3e1ccf78ef646b0af42bc1ecf6e1ddbb9f952c8 (patch) | |
tree | b6c09197bcb3b5bdd1c01dcb8747c1fa885fb58f /src/plugins/qmlprofiler/qmlprofilertracefile.cpp | |
parent | 2404974176ad7aef48e3b6cf12c42426b7a0be23 (diff) | |
download | qt-creator-c3e1ccf78ef646b0af42bc1ecf6e1ddbb9f952c8.tar.gz |
QmlProfiler: save trace data in background thread
Trace data is saved in the background, progress is emitted, and
the save operation can be canceled. While data is being saved
the views are disabled and a semitransparent layer is put on top
of the trace view.
Task-number: QTCREATORBUG-11822
Change-Id: I94ec93147fb1788fc85939ddc591961d058050b5
Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com>
Diffstat (limited to 'src/plugins/qmlprofiler/qmlprofilertracefile.cpp')
-rw-r--r-- | src/plugins/qmlprofiler/qmlprofilertracefile.cpp | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp index 05451ae133..3f1a7e1c68 100644 --- a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp @@ -425,7 +425,8 @@ QmlProfilerFileWriter::QmlProfilerFileWriter(QObject *parent) : m_startTime(0), m_endTime(0), m_measuredTime(0), - m_v8Model(0) + m_v8Model(0), + m_future(0) { } @@ -453,8 +454,21 @@ void QmlProfilerFileWriter::setNotes(const QVector<QmlProfilerDataModel::QmlEven m_notes = notes; } +void QmlProfilerFileWriter::setFuture(QFutureInterface<void> *future) +{ + m_future = future; +} + void QmlProfilerFileWriter::save(QIODevice *device) { + if (m_future) { + m_future->setProgressRange(0, + qMax(m_qmlEvents.size() + m_ranges.size() + m_notes.size() + + m_v8Model->numberOfV8Events(), 1)); + m_future->setProgressValue(0); + m_newProgressValue = 0; + } + QXmlStreamWriter stream(device); stream.setAutoFormatting(true); @@ -469,7 +483,10 @@ void QmlProfilerFileWriter::save(QIODevice *device) stream.writeStartElement(_("eventData")); stream.writeAttribute(_("totalTime"), QString::number(m_measuredTime)); - for (int typeIndex = 0; typeIndex < m_qmlEvents.size(); ++typeIndex) { + for (int typeIndex = 0; typeIndex < m_qmlEvents.size(); ++typeIndex) { + if (isCanceled()) + return; + const QmlProfilerDataModel::QmlEventTypeData &event = m_qmlEvents[typeIndex]; stream.writeStartElement(_("event")); @@ -496,12 +513,16 @@ void QmlProfilerFileWriter::save(QIODevice *device) if (event.message == MemoryAllocation) stream.writeTextElement(_("memoryEventType"), QString::number(event.detailType)); stream.writeEndElement(); + incrementProgress(); } stream.writeEndElement(); // eventData stream.writeStartElement(_("profilerDataModel")); for (int rangeIndex = 0; rangeIndex < m_ranges.size(); ++rangeIndex) { + if (isCanceled()) + return; + const QmlProfilerDataModel::QmlEventData &range = m_ranges[rangeIndex]; stream.writeStartElement(_("range")); @@ -550,11 +571,15 @@ void QmlProfilerFileWriter::save(QIODevice *device) stream.writeAttribute(_("amount"), QString::number(range.numericData1)); stream.writeEndElement(); + incrementProgress(); } stream.writeEndElement(); // profilerDataModel stream.writeStartElement(_("noteData")); for (int noteIndex = 0; noteIndex < m_notes.size(); ++noteIndex) { + if (isCanceled()) + return; + const QmlProfilerDataModel::QmlEventNoteData ¬es = m_notes[noteIndex]; stream.writeStartElement(_("note")); stream.writeAttribute(_("startTime"), QString::number(notes.startTime)); @@ -562,15 +587,35 @@ void QmlProfilerFileWriter::save(QIODevice *device) stream.writeAttribute(_("eventIndex"), QString::number(notes.typeIndex)); stream.writeCharacters(notes.text); stream.writeEndElement(); // note + incrementProgress(); } stream.writeEndElement(); // noteData - m_v8Model->save(stream); + if (isCanceled()) + return; + m_v8Model->save(stream, m_future); stream.writeEndElement(); // trace stream.writeEndDocument(); } +void QmlProfilerFileWriter::incrementProgress() +{ + if (!m_future) + return; + + m_newProgressValue++; + if (float(m_newProgressValue - m_future->progressValue()) + / float(m_future->progressMaximum() - m_future->progressMinimum()) >= 0.01) { + m_future->setProgressValue(m_newProgressValue); + } +} + +bool QmlProfilerFileWriter::isCanceled() const +{ + return m_future && m_future->isCanceled(); +} + } // namespace Internal } // namespace QmlProfiler |