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;
};