[Interest] QFutureWatcher and qRegisterMetaType

Rainer Wiesenfarth Rainer_Wiesenfarth at trimble.com
Fri Jul 10 15:43:54 CEST 2015


(TOFU to keep full version of original solution without hiding my reply)

I am not sure how your initial project looks, but for the code you sent, 
I would suggest a different approach:

class Worker
{
   public:
     int doHeavyStuff()
     {
       return 42;
     }
};


class Handler
{
   public:
     Handler()
       : m_worker( new Worker )
     { }

     QFuture<int> meaningOfLife()
     {
       return QtConcurrent::run( m_worker, &Worker::doHeavyStuff );
     }

   private:
     Worker *m_worker;
};

NOTE: This code snippet is untested, it is based on this article: 
http://doc.qt.io/qt-4.8/qtconcurrentrun.html

If your application is as simple as above, you might even drop the 
Handler class (as it does almost nothing now).


Am 10.07.2015 um 12:51 schrieb Lorenz Haas:
> Hi,
>
> I try to use QFuture/QFutureWatcher for my own project. So far I have
> this simplified setting, in which Handler is living in the GUI thread:
>
> class Worker : public QObject
> {
>    Q_OBJECT
>
>    public slots:
>      void doHeavyStuff(QFutureInterface<int> inter) {
>        inter.reportResult(42);
>        inter.reportFinished();
>      }
> };
>
> class Handler : public QObject
> {
>    Q_OBJECT
>
>    public:
>      Handler(QObject *parent = 0) :
>        QObject(parent),
>        m_worker(new Worker)
>      {
>        m_worker->moveToThread(&m_thread);
>        connect(&m_thread, &QThread::finished, m_worker,
> &QObject::deleteLater);
>        m_thread.start();
>      }
>
>      QFuture<int> meaningOfLife()
>      {
>        QFutureInterface<int> inter;
>        inter.reportStarted();
>        QMetaObject::invokeMethod(m_worker, "doHeavyStuff",
> Qt::QueuedConnection, Q_ARG(QFutureInterface<int>, inter));
>        return inter.future();
>      }
>
>    private:
>      Worker *m_worker;
>      QThread m_thread;
> };
>
> This works fine if I add "qRegisterMetaType<QFutureInterface<int>
>  >("QFutureInterface<int>");" somewhere. This, however, makes me nervous
> because it feels like I have not to do this. It's a pure paranoid feeling...
> Therefore:
>    a) Is the approach above okay?
>    b) Why QFutureInterface isn't registered already by Qt? Is it because
> one can't register templated classes easily?
> [...]

Best Regards / Mit freundlichen Grüßen
Rainer Wiesenfarth

-- 
Software Engineer | Trimble Imaging Division
Rotebühlstraße 81 | 70178 Stuttgart | Germany
Office +49 711 22881 0 | Fax +49 711 22881 11
http://www.trimble.com/imaging/ | http://www.inpho.de/

Trimble Germany GmbH, Am Prime Parc 11, 65479 Raunheim
Eingetragen beim Amtsgericht Darmstadt unter HRB 83893,
Geschäftsführer: Dr. Frank Heimberg, Hans-Jürgen Gebauer

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4255 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150710/81743d28/attachment.bin>


More information about the Interest mailing list