C++ 带螺纹的Qt信号槽

C++ 带螺纹的Qt信号槽,c++,multithreading,qt,C++,Multithreading,Qt,QThread类中的信号/插槽有问题。我的设计是这样的: class Manager : public QObject { Q_OBJECT public: Manager(QObject* parent) : QObject(parent) { Thread thread* = new Thread(this); connect(this, SIGNAL(testsignal()), thread, SLOT(test()));

QThread类中的信号/插槽有问题。我的设计是这样的:

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() {}
};
类管理器:公共QObject{
Q_对象
公众:
经理(QObject*父对象):QObject(父对象){
螺纹*=新螺纹(此);
连接(此、信号(testsignal())、线程、插槽(test());
线程->开始();
...
发射测试信号();
}
信号:
void testsignal();
};
类线程:公共QThread{
Q_对象
公众时段:
无效测试(){
qDebug()问题在于,这会导致将信号排队到目标线程的事件队列(排队连接)中。如果该线程从不处理事件,它将永远无法获得信号

还有:

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


换句话说,使用空的
run
方法会导致线程立即终止,因此您正在向死线程发送信号。

发送到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";
    }
};
类管理器:公共QObject{
Q_对象
公众:
经理(QObject*父对象):QObject(父对象){
Thread Thread*=新的QThread(此);
Receiver*rec=new Receiver();//无父项
连接(此,信号(testsignal()),rec,插槽(test());
连接(线程、信号(finished()、rec、插槽(deleteLater());
rec->moveToThread(线程);
线程->开始();
...
发射测试信号();
}
信号:
void testsignal();
};
类接收者:公共QObject{
Q_对象
公众时段:
无效测试(){

qDebug()
Thread::test()
未定义为插槽。抱歉,这是一个输入错误。
Thread-Thread*
另一个输入错误?您的代码现在对我有效。为什么在
线程中有一个空的
run()
方法?为什么?已经有了一个非常好的
run()实现
您只需离开即可。类似地,您不应该从
QThread
派生。将您的
测试()
插入一个不是线程的
QObject
派生类。只是顺便说一句-不要将
QThread
子类化;相反,创建一个
QThread
,将适当的对象移动到它,然后启动它的事件循环。请参阅Maya Posch获得良好的建议。好的。我在我的运行方法中添加了一个infinte循环:
while(true){
没有任何更改。我从未收到信号。@adapto,因为您需要启动事件循环。最简单的方法是调用
this->exec()
(或者一开始就不要重新实现run)。谢谢。我尝试了这个方法,但它不起作用。我添加了
连接(线程,信号(start()),mFetchTilesThread,SLOT(run());
并将我的
run()
方法放入
公共槽中
。此方法被正确调用。