On Thursday 21 January 2016 02:37:43 Marc Mutz wrote:
> On Wednesday 20 January 2016 21:52:49 Thiago Macieira wrote:
> > On Wednesday 20 January 2016 21:08:07 Pau Garcia i Quiles wrote:
> > > Replacing QThread with std::thread? Please don't.
> > 
> > Unlike the containers or even futures/promises vs QtConcurrent, we can
> > easily  argue that QThread provides a lot more functionality than
> > std::thread. In just one word: signals.
> 
> What happened to "you're doing it wrong!"? :) AFAIU that blog post, you're
> supposed to use the signals of QObjects living in that thread, not the
> QThread itself.

You can use the signals and the slots of the QThread itself. The wrong part 
was deriving from QThread, adding slots to it and then doing 
moveToThread(this) so those slots got called in the thread that it manages.

Other uses of QThread are fine. You can derive from it and override run. You 
can even add more signals to it. It's new slots that are suspicious.

> And that's perfectly possible with std::thread, too:
> 
>      auto po = new ProcessingObject();
>      connect(po, ...);
>      po->moveToThread(nullptr); // enable "pulling" moveToThread()
>      auto t = std::thread([po, gui = QThread::currentThread()]() {
>          QEventLoop loop;
>          po->moveToThread(QThread::currentThread());
>          connect(po, ..., &loop, &QEventLoop::quit);
>          loop.exec();
>          po->moveToThread(gui);
>          // or: delete po;
>      }
> 
> Am I missing something?

How do you interrupt the event loop from outside (QThread::quit)? You can't 
create that QEventLoop before the lambda because it would live in the wrong 
thread. You could use this:

        po->thread()->quit();

but note how you used QThread. If you're going to use QThread anyway, you may 
as well use it to start the thread.

Even if you didn't do this, your example uses QThread 
(QThread::currentThread(), which returns a QAdoptedThread pointer). And even 
if you didn't moveToThread(), you created a QObject in that thread (the 
QEventLoop), which will create the QThreadData and the event dispatcher 
machinery.

At that point, QThread is a simple wrapper full of convenience functions.

> > We should provide QThread::makeThread() taking a lambda and some other
> > niceties, though.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to