2015-10-19 6 views
2

У меня проблема с сигналом/слотом в классе QThread. Мой дизайн выглядит так:Слот сигнала Qt с потоками

class Manager : public QObject { 
    Q_OBJECT 
public: 
    Manager(QObject* parent) : QObject(parent) { 
     Thread thread* = new Thread(this); 
     connect(this, SIGNAL(testsignal()), thread, SLOT(test())); 
     thread->start(); 

     ... 

     emit testsignal(); 
    } 
signals: 
    void testsignal(); 
}; 

class Thread : public QThread { 
    Q_OBJECT 
public slots: 
    void test() { 
     qDebug() << "TEST"; 
    } 
private: 
    void run() {} 
}; 

Сигнал никогда не достигает моего метода test(). Может кто-нибудь помочь? Благодарю.

+1

'Thread :: тест()' не определен как слот. – owacoder

+0

Извините. Это была опечатка. – adapto

+0

'Thread thread *' еще одна опечатка? Теперь ваш код работает для меня. – SingerOfTheFall

ответ

2

Проблема заключается в том, что sending signals across threads приводит к очередности сигнала в очередь событий целевой очереди (очередь в очереди). Если этот поток никогда не обрабатывает события, он никогда не получит сигнал.

Кроме того, according to the QThread::run documentation:

Возвращение из этого метода закончится выполнение потока.

Другими словами, наличие пустого метода run приводит к мгновенному завершению потока, поэтому вы отправляете сигнал мертвой нити.

+0

Хорошо. Я добавил цикл infinte к моему методу запуска: 'while (true) {}' и ничего не изменилось. Я никогда не получаю сигнал. – adapto

+2

@adapto, потому что вам нужно запустить * event * loop, самый простой способ сделать это - вызвать this this-exec() '(или не выполнять повторный запуск запуска в первую очередь). –

0

Сигналы, отправленные объекту QThread, перейдут в поток родительского объекта. В этом случае к тот же поток, который создал его.

Чтобы объект жить в другом потоке вы должны переместить его в этой теме:

class Manager : public QObject { 
    Q_OBJECT 
public: 
    Manager(QObject* parent) : QObject(parent) { 
     Thread thread* = new QThread(this); 
     Receiver* rec = new Receiver(); //no parent 
     connect(this, SIGNAL(testsignal()), rec, SLOT(test())); 
     connect(thread, SIGNAL(finished()), rec, SLOT(deleteLater())); 
     rec->moveToThread(thread); 
     thread->start(); 

     ... 

     emit testsignal(); 
    } 
signals: 
    void testsignal(); 
}; 

class Receiver: public QObject { 
    Q_OBJECT 
public slots: 
    void test() { 
     qDebug() << "TEST"; 
    } 
}; 
+0

Спасибо. Я попробовал это, и это не сработало. Я добавил 'connect (thread, SIGNAL (start()), mFetchTilesThread, SLOT (run())); и поместил мой метод' run() 'в' public slot'. И этот метод называется правильно. – adapto

Смежные вопросы