OSDN Git Service

Help requests must be done in main thread.
authorEike Ziller <eike.ziller@nokia.com>
Wed, 27 Jul 2011 13:37:56 +0000 (15:37 +0200)
committerChristian Kandeler <christian.kandeler@nokia.com>
Wed, 27 Jul 2011 15:16:22 +0000 (17:16 +0200)
Fixes an occassional assert "Cannot send events to objects owned by a
different thread." with receiver QHelpEngineCorePrivate.

Change-Id: I77ffd663a055c493607907374f7a4d775f6aac6c
Reviewed-on: http://codereview.qt.nokia.com/2289
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
src/plugins/qtsupport/gettingstartedwelcomepage.cpp

index eb225a2..794d465 100644 (file)
@@ -41,6 +41,8 @@
 #include <coreplugin/helpmanager.h>
 #include <projectexplorer/projectexplorer.h>
 
+#include <QtCore/QMutex>
+#include <QtCore/QMutexLocker>
 #include <QtGui/QGraphicsProxyWidget>
 #include <QtGui/QScrollBar>
 #include <QtGui/QSortFilterProxyModel>
@@ -54,6 +56,19 @@ namespace Internal {
 
 const char *C_FALLBACK_ROOT = "ProjectsFallbackRoot";
 
+class Fetcher : public QObject
+{
+    Q_OBJECT
+public slots:
+    void fetchData(const QUrl &url)
+    {
+        fetchedData = Core::HelpManager::instance()->fileData(url);
+    }
+
+public:
+    QByteArray fetchedData;
+};
+
 class HelpImageProvider : public QDeclarativeImageProvider
 {
 public:
@@ -62,18 +77,29 @@ public:
     {
     }
 
+    // gets called by declarative in separate thread
     QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize)
     {
+        QMutexLocker lock(&m_mutex);
         QUrl url = QUrl::fromEncoded(id.toAscii());
-        QByteArray imgData = Core::HelpManager::instance()->fileData(url);
-        QBuffer imgBuffer(&imgData);
+        if (!QMetaObject::invokeMethod(&m_fetcher,
+                                       "fetchData",
+                                       Qt::BlockingQueuedConnection,
+                                       Q_ARG(QUrl, url))) {
+            return QImage();
+        }
+        QBuffer imgBuffer(&m_fetcher.fetchedData);
         imgBuffer.open(QIODevice::ReadOnly);
         QImageReader reader(&imgBuffer);
         QImage img = reader.read();
         if (size && requestedSize != *size)
             img = img.scaled(requestedSize);
+        m_fetcher.fetchedData.clear();
         return img;
     }
+private:
+    Fetcher m_fetcher;
+    QMutex m_mutex;
 };
 
 GettingStartedWelcomePage::GettingStartedWelcomePage()
@@ -202,3 +228,4 @@ void GettingStartedWelcomePage::updateTagsModel()
 } // namespace Internal
 } // namespace QtSupport
 
+#include "gettingstartedwelcomepage.moc"