Рассмотрим QObject
:
class TestObject: public QObject
{
Q_OBJECT
public slots:
void doStuff();
};
Мы запустим этот объект в другом потоке:
TestObject* o = new TestObject;
o->moveToThread(someThreadPointer);
Теперь, как мне вызвать doStuff
, чтобы это произошло в рабочем потоке? Если у меня есть другой объект в основном потоке, я могу сделать это:
class OtherObject: public QObject
{
Q_OBJECT
signals:
signalToDoStuff();
};
Тогда в основном потоке:
TestObject* o = new TestObject;
o->moveToThread(someThreadPointer);
OtherObject other* = new OtherObject;
QObject::connect(other, &OtherObject::signalToDoStuff, o, &TestObject::doStuff);
// Emit the signal which causes `doStuff` to be called in other thread
other->signalToDoStuff();
Но это долгий путь. Мне нужно поставить в очередь событие для вызова doStuff
.
QMetaObject::invokeMethod(testObject, "doStuff", Qt::QueuedConnection);
. - person Jarod42   schedule 03.08.2016std::bind
или лямбду) и все. Вы также немного ошибочно сформулировали это: вас не волнуютconnect
, вы заботитесь о том, чтобы не было лишних сигналов. Например. Мой ответ на другой вопрос касается того, как можно избежать использования специального класса для излучения сигнала, используяQObject::destroyed
на временном объекте. - person Kuba hasn't forgotten Monica   schedule 03.08.2016QMetaObject::invoke
там функтор. - person Kuba hasn't forgotten Monica   schedule 03.08.2016