Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > сигнал из другого потока


Автор: xbarmaglot 6.4.2017, 21:43
есть объект, который создается в главном потоке.
у него есть сигнал. данныe в объект поступают из вторичного потока.
он их обрабатывает во вторичном потоке и кидает сигнал.

что-то вроде этого (схематично), только поток запускает не он, а другой объект,
а данные передаются через цепочку обязанностей

Код

struct Data {...};
class Some : public QThread {
    Q_OBJECT
 
private:
    virtual void run(void) override
    {
        ...
        emit sendEvent(data);
    }
 
signals:
    void sendEvent(const Data& data);
};
 
class Receiver : public QObject {
    Q_OBJECT
 
public slots:
    void recvEvent(const Data& data);
};
 
main()
{
    Some some;
    Receiver recv;
    connect(&some, &Some::sendEvent, &recv, &Receiver::recvEvent);
    some.start();
 
    exec();
}


connect проходит без ошибок, но данные не приходят.
подозреваю, что emit помещает данные в QEventLoop вторичного потока, а не главного.

Как тогда вызвать сигнал из вторичного потока, чтобы он попал в главный?

З.Ы. moveToThread не канает, т.к. я не знаю про поток ничего.
Кроме этого, данные могут приходить и из главного потока

Автор: Alexeis 6.4.2017, 23:25
Цитата(xbarmaglot @  6.4.2017,  22:43 Найти цитируемый пост)
З.Ы. moveToThread не канает, т.к. я не знаю про поток ничего.
Кроме этого, данные могут приходить и из главного потока 

  Можно попробовать явно указать DirectConnection в функции connect тогда слот всегда будет вызываться в контексте эмита. И синхронизацию доступа значит руками.

Автор: xbarmaglot 7.4.2017, 13:29
Цитата(Alexeis @  6.4.2017,  23:25 Найти цитируемый пост)
Можно попробовать явно указать DirectConnection в функции connect тогда слот всегда будет вызываться в контексте эмита. И синхронизацию доступа значит руками. 


Не работает. Прикол в том, что и сообщений об ошибках нет

Автор: xbarmaglot 7.4.2017, 13:56
решил. мой косяк. спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)