gpt4 book ai didi

c++ - Qt moveToThread 插槽未调用

转载 作者:行者123 更新时间:2023-11-28 06:44:18 25 4
gpt4 key购买 nike

我有一个类 Manager

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

我也有像这样的 TaskA 类:

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

我还有这样的TaskB

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

当我启动管理器时:

Manager *_manager = new Manager();

_manager->start();

未调用 TaskB 的插槽 onSignalOk()

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

最佳答案

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

相反,只需从 QObject 继承并将对象移动到新线程。这样做的好处是能够将多个对象移动到一个新线程,而不是如果要继承 QThread 则必须为每个对象创建一个单独的线程。

关于c++ - Qt moveToThread 插槽未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com