Changed thread handling for translation fetching
authorBartosz Szatkowski <bulislaw@linux.com>
Thu, 12 Aug 2010 10:17:06 +0000 (12:17 +0200)
committerBartosz Szatkowski <bulislaw@linux.com>
Thu, 12 Aug 2010 10:17:06 +0000 (12:17 +0200)
trunk/src/base/backbone/backbone.cpp
trunk/src/base/backbone/backbone.h

index 293307f..b206fb0 100644 (file)
@@ -35,6 +35,13 @@ QList<Translation*> mapSearch(CommonDictInterface *dict) {
     return QList<Translation*>();
 }
 
+class TranslationPtr {
+    Translation* _tr;
+public:
+    TranslationPtr(Translation* tr) :_tr(tr) {}
+    QString toHtml() const {return _tr->toHtml();}
+};
+
 void Backbone::init() {
    _interval = 250; //msec
    dryRun = false;
@@ -424,26 +431,25 @@ QStringList Backbone::htmls() {
 void Backbone::searchHtml(QList<Translation *> translations) {
     _timerHtmlSearch.stop();
     _htmlResult.clear();
-    _innerHtmlResult.clear();
-    _timerHtmlSearch.start();
+    QList<TranslationPtr> dummy;
+    foreach(Translation* tr, translations)
+        dummy.append(TranslationPtr(tr));
+    _timerHtmlSearch.start(_interval);
 
-    foreach(Translation* trans, translations)
-        if(trans)
-           _innerHtmlResult.append(
-                   QtConcurrent::run(trans, &Translation::toHtml));
+   _innerHtmlResult = QtConcurrent::mapped(dummy,
+                                            &TranslationPtr::toHtml);
 }
 
 void Backbone::htmlTranslationReady() {
-    foreach(QFuture<QString> res, _innerHtmlResult) {
-        if(!res.isFinished())
-            continue;
-        _htmlResult.append(res.result());
-        _innerHtmlResult.removeOne(res);
-    }
-    if(!_innerHtmlResult.size()) {
-        _timerHtmlSearch.stop();
-        Q_EMIT htmlReady();
-    }
+    if(!_innerHtmlResult.isFinished())
+        return;
+
+   _timerHtmlSearch.stop();
+   QFutureIterator<QString> it(_innerHtmlResult);
+   while(it.hasNext())
+       _htmlResult.append(it.next());
+
+    Q_EMIT htmlReady();
 
 }
 
index 68808db..a0b41b0 100644 (file)
@@ -159,7 +159,7 @@ private:
     QHash<CommonDictInterface*, bool> _dicts;
     QList<CommonDictInterface*> _plugins;
     QFuture<QList<Translation*> > _innerResult;
-    QList<QFuture<QString> > _innerHtmlResult;
+    QFuture<QString> _innerHtmlResult;
     QMultiHash<QString, Translation*> _result;
     QStringList _htmlResult;
     QTimer _timerSearch, _timerHtmlSearch;