Agreed. It took me a long time and pain to realize that deriving from QThread is a bad idea. Just using connect options, or QTimer::singleShot(0, etc) to queue it on the wanted thread, is a much better implementation.

I was really misled by the documentation.

Le 30-11-2018 20:15, Jérôme Godbout a écrit :
The fact that QObject belong to Thread A and a method is used into
Thread B should raise a flag, each QObject belong to a QThread and
they should be used by that QThread only. You should move the Object
to the other thread or use a signals / slots to communicate between
thread.

You will have many problems the way you describe it, the fact that the
thread B is launching the signal of Object that belong on Thread A,
the automatic connection will check the ownership of the object
emiting the signal to queue or not the signal and this will be wrong
since the related thread is not the current thread.

Note: inheriting QThread is wrong practice and should probably never
be done. Since the Qthread belong to the thread creator and not the
created thread you will have the wrong current thread for the current
QObject that inherit QThread.

You can see this article that explain the problem by inheriting the
QThread:
http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/

The Qthread doc and example should really be updated if they still
show inheritance of QThread, many green developer fall into the pit
every time and I can understand if the doc still do this.

-----Original Message-----
From: Interest <[email protected]> On Behalf Of
Alexander Dyagilev
Sent: November 30, 2018 1:53 PM
To: [email protected]
Subject: [Interest] Is it OK to emit from different thread?

Hello,

Let's suppose some QObject derived class belongs to thread A. It has
some method, which emits some signal.

This method may be called from another thread B. Thus, signal will be
issued for this object from the thread it does not belong to.

Is it OK?

source code (just in case):

class MyObject {
Q_OBJECT
signals:
void mySignal();
public:
void test();
}

void MyObject::test()
{
      emit mySignal();
}

// thread A:
...
auto obj = new MyObject();
...

// thread B:
...
obj->test();
...

_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest
_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest
_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest

Reply via email to