带线程的Qt信号插槽

问题描述:

我在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

'主题::测试()'不被定义为一个槽。 – owacoder

+0

对不起。这是一个错字。 – adapto

+0

'线程线程*'另一个错字?你的代码现在适用于我。 – SingerOfTheFall

问题是sending signals across threads导致排队信号到目标线程的事件队列(排队连接)。如果该线程从不处理事件,它将永远不会得到信号。

此外,according to the QThread::run documentation

从该方法返回将结束线程的执行。

换句话说,有一个空的run方法会导致线程的即时终止,所以你发送一个信号到一个死的线程。

+0

好的。我为我的run方法添加了一个infinte循环:'while(true){}'并且没有任何变化。我从来没有收到信号。 – adapto

+2

@adapto因为您需要启动* event *循环,所以最简单的方法就是调用'this-> exec()'(或者不要重新实现运行)。 –

发送到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(started()),mFetchTilesThread,SLOT(run()));'并将'run()'方法放到'public slot'中。这个方法被正确调用。 – adapto