C++ 未调用Qt moveToThread插槽

C++ 未调用Qt moveToThread插槽,c++,qt,signals,qthread,slot,C++,Qt,Signals,Qthread,Slot,我有一个班级经理 我还有这样的类TaskA: 当我以以下方式启动Manager时: 经理*_经理=新经理() _管理器->开始() 未调用TaskB的插槽onSignalOk() 我认为问题的原因是连接信号时的默认参数Qt::AutoConnection,但我不明白 我建议不要从QThread开始;它的名字有误导性,因为它更像是一个线程管理器。在我看来,从QThread继承的唯一原因是如果您想更改Qt管理线程的方式 相反,只需从QObject继承并将对象移动到新线程。这样做的好处是可以将多个对象

我有一个班级
经理

我还有这样的类
TaskA

当我以以下方式启动Manager时:

经理*_经理=新经理()

_管理器->开始()

未调用
TaskB
的插槽
onSignalOk()


我认为问题的原因是连接信号时的默认参数
Qt::AutoConnection
,但我不明白

我建议不要从QThread开始;它的名字有误导性,因为它更像是一个线程管理器。在我看来,从QThread继承的唯一原因是如果您想更改Qt管理线程的方式


相反,只需从QObject继承并将对象移动到新线程。这样做的好处是可以将多个对象移动到一个新线程,而不是在继承QThread时为每个对象创建单独的线程。

这里还有其他问题,您需要考虑线程关联性。我建议你从阅读这篇文章开始:这个标题有误导性。Qt内部有一个movetoThread和一个名为movetoThreadSignal的函数。很大的不同。让我们后退一步。你最终想做什么?上面的代码有很多缺陷。尤其是
thread=newqthread();线程->开始()。你期望从这段代码中得到什么?这段代码只是一个工作台。我的项目是一个任务管理器。TaskB是一个并行运行其他任务(如TaskA)的任务。感谢@Merlin069的评论。有了这篇文章,我纠正了我的经理,它现在可以工作了。管理器继承QObject而不是QThread,然后我使用moveToThread。
class Manager : public QThread 
{
    Q_OBJECT
    public:
    Manager();
    void run()
    {
        taskB = new TaskB();
        taskA = new TaskA();
        connect(taskA, SIGNAL(signalOk()), taskB, SLOT(onSignalOk()));
        connect(taskA, SIGNAL(moveOk()), taskB, SLOT(onMoveOk()));
        connect(taskB, SIGNAL(signal()), taskA, SLOT(onSignal()));
        connect(taskB, SIGNAL(moveToThreadSignal(QThread*)), taskA, SLOT(onMoveToThread(QThread*)));
        connect(this, SIGNAL(runSignal()), taskB, SLOT(onRun()));
        emit runSignal();
    }
    TaskA* taskA;
    TaskB * taskB;
    signals:
    void runSignal();
    };
class TaskA : public QObject
{
    Q_OBJECT
    public:
    TaskA();
    void run()
    {
        std::cout << "[INFO] : Task run: " << QThread::currentThreadId() << std::endl;
        emit signalOk();
    }
    public slots:
    void onSignal()
    {
        run();
    }
    void onMoveToThread(QThread * t)
    {
        std::cout << "[INFO] : Task A after move to thread: " << QThread::currentThreadId() << std::endl;
        this->moveToThread(t);
        std::cout << "[INFO] : Task A after move to thread: " << QThread::currentThreadId() << std::endl;
        emit moveOk();
    }
    signals:
    void signalOk();
    void moveOk();
};
class TaskB : public QObject
{
    Q_OBJECT
    public:
    TaskB();
    void run()
    {
        std::cout << "[INFO] : TaskB run: " << QThread::currentThreadId() << std::endl;
        emit signal();
    }
    signals:
    void signal();
    void moveToThreadSignal(QThread* t);
    public slots:
    void onSignalOk()
    {
        std::cout << "[INFO] : TaskB onSignalOk : " << QThread::currentThreadId() << std::endl;
    }
    void onMoveOk()
    {
        std::cout << "[INFO] : TaskB onMoveOk: " << QThread::currentThreadId() << std::endl;
        run();
    }
    void onRun()
    {
        std::cout << "[INFO] : TaskB emit MoveToThreadSignal: " << QThread::currentThreadId() << std::endl;
        thread = new QThread();
        thread->start();
        emit moveToThreadSignal(thread);
    }
    private:
    QThread * thread;
};