Implement QQuickContext2DRenderThread class for threaded context2d rendering
authorCharles Yin <yinyunqiao@gmail.com>
Thu, 3 May 2012 13:31:17 +0000 (23:31 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 4 May 2012 06:47:10 +0000 (08:47 +0200)
Change-Id: I221690c730fd412b23705c0d687d1abbac38974d
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
src/quick/items/context2d/qquickcanvasitem.cpp
src/quick/items/context2d/qquickcanvasitem_p.h

index 6c8c8f3..7673c39 100644 (file)
 
 QT_BEGIN_NAMESPACE
 
+QHash<QQmlEngine *,QQuickContext2DRenderThread*> QQuickContext2DRenderThread::renderThreads;
+QMutex QQuickContext2DRenderThread::renderThreadsMutex;
+
+QQuickContext2DRenderThread::QQuickContext2DRenderThread(QQmlEngine *eng)
+    : QThread(eng), m_engine(eng), m_eventLoopQuitHack(0)
+{
+    Q_ASSERT(eng);
+    m_eventLoopQuitHack = new QObject;
+    m_eventLoopQuitHack->moveToThread(this);
+    connect(m_eventLoopQuitHack, SIGNAL(destroyed(QObject*)), SLOT(quit()), Qt::DirectConnection);
+    start(QThread::IdlePriority);
+}
+
+QQuickContext2DRenderThread::~QQuickContext2DRenderThread()
+{
+    renderThreadsMutex.lock();
+    renderThreads.remove(m_engine);
+    renderThreadsMutex.unlock();
+
+    m_eventLoopQuitHack->deleteLater();
+    wait();
+}
+
+QQuickContext2DRenderThread *QQuickContext2DRenderThread::instance(QQmlEngine *engine)
+{
+    QQuickContext2DRenderThread *thread = 0;
+    renderThreadsMutex.lock();
+    if (renderThreads.contains(engine))
+        thread = renderThreads.value(engine);
+    else {
+        thread = new QQuickContext2DRenderThread(engine);
+        renderThreads.insert(engine, thread);
+    }
+    renderThreadsMutex.unlock();
+    return thread;
+}
+
 class QQuickCanvasItemPrivate : public QQuickItemPrivate
 {
 public:
index 5238fbc..c7fce72 100644 (file)
@@ -44,6 +44,7 @@
 
 #include <QtQuick/qquickitem.h>
 #include <private/qv8engine_p.h>
+#include <QtCore/QThread>
 
 QT_BEGIN_HEADER
 
@@ -161,6 +162,22 @@ private:
     bool isPaintConnected();
 };
 
+class QQuickContext2DRenderThread : public QThread
+{
+    Q_OBJECT
+public:
+    QQuickContext2DRenderThread(QQmlEngine *eng);
+    ~QQuickContext2DRenderThread();
+
+    static QQuickContext2DRenderThread *instance(QQmlEngine *engine);
+
+private:
+    QQmlEngine *m_engine;
+    QObject *m_eventLoopQuitHack;
+    static QHash<QQmlEngine *,QQuickContext2DRenderThread*> renderThreads;
+    static QMutex renderThreadsMutex;
+};
+
 QT_END_NAMESPACE
 
 QML_DECLARE_TYPE(QQuickCanvasItem)