[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kdecore
From:       David Faure <faure () kde ! org>
Date:       2010-11-13 1:22:43
Message-ID: 20101113012243.3893EAC89E () svn ! kde ! org
[Download RAW message or body]

SVN commit 1196326 by dfaure:

Calling KGlobal::locale() for the first time in a secondary thread was crashing \
already, but with lots of confusing Qt errors. Now make the behavior explicit and \
documented. Can't be changed, since we have to install the qtranslator in the main \
thread anyway.


 M  +7 -1      kernel/kglobal.cpp  
 M  +20 -0     tests/kglobaltest.cpp  


--- trunk/KDE/kdelibs/kdecore/kernel/kglobal.cpp #1196325:1196326
@@ -28,6 +28,7 @@
 
 #include "kglobal.h"
 #include "kglobal_p.h"
+#include <QThread>
 
 #include <config.h>
 
@@ -160,9 +161,14 @@
         QTextCodec::setCodecForLocale(d->locale->codecForEncoding());
         mainComponent().aboutData()->translateInternalProgramName();
         QCoreApplication* coreApp = QCoreApplication::instance();
-        if (coreApp) // testcase: kwrite --help: no qcore app
+        if (coreApp) { // testcase: kwrite --help: no qcore app
+            if (coreApp->thread() != QThread::currentThread()) {
+                qFatal("KGlobal::locale() must be called from the main thread before \
using i18n() in threads. KApplication takes care of this. If not using KApplication, \
call KGlobal::locale() during initialization."); +            } else {
             QCoreApplication::installTranslator(new KDETranslator(coreApp));
     }
+        }
+    }
     return d->locale;
 }
 
--- trunk/KDE/kdelibs/kdecore/tests/kglobaltest.cpp #1196325:1196326
@@ -60,6 +60,26 @@
         QVERIFY(!QTest::kWaitForSignal(this, SIGNAL(sigFoo()), 1));
     }
 
+    // For testing from multiple threads in testThreads
+    void testLocale()
+    {
+        KGlobal::locale();
+        KGlobal::locale()->setDecimalPlaces(2);
+        QCOMPARE(KGlobal::locale()->formatNumber(70), QString("70.00"));
+    }
+
+    // Calling this directly aborts in KGlobal::locale(), this is intended.
+    // We have to install the qtranslator in the main thread.
+    void testThreads()
+    {
+        QThreadPool::globalInstance()->setMaxThreadCount(10);
+        QList<QFuture<void> > futures;
+        futures << QtConcurrent::run(this, &KGlobalTest::testLocale);
+        futures << QtConcurrent::run(this, &KGlobalTest::testLocale);
+        Q_FOREACH(QFuture<void> f, futures)
+            f.waitForFinished();
+    }
+
 protected Q_SLOTS:
     void emitSigFoo()
     {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic