Generate flame graph in background thread.
authorMilian Wolff <mail@milianw.de>
Sat, 5 Dec 2015 01:27:55 +0000 (02:27 +0100)
committerMilian Wolff <mail@milianw.de>
Sat, 5 Dec 2015 01:27:55 +0000 (02:27 +0100)
Also add a temporary text that indicates we are generating the graph.

gui/flamegraph.cpp
gui/flamegraph.h

index 301ba21..f45f7c5 100644 (file)
@@ -32,6 +32,7 @@
 #include <QDebug>
 #include <QAction>
 
+#include <ThreadWeaver/ThreadWeaver>
 #include <KLocalizedString>
 #include <KColorScheme>
 
@@ -57,6 +58,8 @@ private:
     bool m_isHovered;
 };
 
+Q_DECLARE_METATYPE(FrameGraphicsItem*);
+
 FrameGraphicsItem::FrameGraphicsItem(const quint64 cost, const QString& function, FrameGraphicsItem* parent)
     : QGraphicsRectItem(parent)
     , m_cost(cost)
@@ -235,6 +238,8 @@ FlameGraph::FlameGraph(QWidget* parent, Qt::WindowFlags flags)
     , m_selectedItem(nullptr)
     , m_minRootWidth(0)
 {
+    qRegisterMetaType<FrameGraphicsItem*>();
+
     setLayout(new QVBoxLayout);
 
     m_scene->setItemIndexMethod(QGraphicsScene::NoIndex);
@@ -294,7 +299,14 @@ void FlameGraph::setBottomUpData(const TreeData& bottomUpData)
 void FlameGraph::showData()
 {
     setData(nullptr);
-    setData(parseData(m_showBottomUpData ? m_bottomUpData : m_topDownData));
+
+    using namespace ThreadWeaver;
+    auto data = m_showBottomUpData ? m_bottomUpData : m_topDownData;
+    stream() << make_job([data, this]() {
+        auto parsedData = parseData(data);
+        QMetaObject::invokeMethod(this, "setData", Qt::QueuedConnection,
+                                  Q_ARG(FrameGraphicsItem*, parsedData));
+    });
 }
 
 void FlameGraph::setData(FrameGraphicsItem* rootItem)
@@ -303,6 +315,8 @@ void FlameGraph::setData(FrameGraphicsItem* rootItem)
     m_rootItem = rootItem;
     m_selectedItem = rootItem;
     if (!rootItem) {
+        auto text = m_scene->addText(i18n("generating flame graph..."));
+        m_view->centerOn(text);
         return;
     }
 
index 580b9c4..0c08211 100644 (file)
@@ -41,9 +41,11 @@ public:
 protected:
     bool eventFilter(QObject* object, QEvent* event) override;
 
+private slots:
+    void setData(FrameGraphicsItem* rootItem);
+
 private:
     void showData();
-    void setData(FrameGraphicsItem* rootItem);
     void selectItem(FrameGraphicsItem* item);
 
     TreeData m_topDownData;