qt 通过将对象移动到跨线程发出信号
Posted
技术标签:
【中文标题】qt 通过将对象移动到跨线程发出信号【英文标题】:qt emitting a signal across threads by moving the object to 【发布时间】:2017-10-18 10:14:51 【问题描述】:我正在寻找正确的模式以在基于 Qt 的应用程序中使用它进行异步处理。
这是一个应该接收信号的简化类
class Receiver : public QObject
Q_OBJECT
public:
explicit Receiver(QObject *parent = nullptr) : QObject(parent)
public slots:
void onNewMessage(Message message)
// ...
;
该类实例的创建是动态的(实际上也很简单 - 用于消息处理的对象数组)。
Receiver* r;
// ...
if (r == nullptr)
r = new Receiver;
r->moveToThread(new QThread);
connect(this, &MessageGenerator::messageCompleted, r, &Receiver::onNewMessage);
在main函数中还存在一个注册:
qRegisterMetaType<Message> ("Message");
问题是为什么永远不会调用 slot? 如果删除线程的东西(moveTOThread),那么一切正常, 但我更喜欢在不同线程的事件循环中进行处理
【问题讨论】:
你没有调用线程start
谢谢!我的注意力不集中:(
【参考方案1】:
根据doc:
构造一个新的 QThread 来管理一个新线程。父级拥有 QThread 的所有权。 在调用 start() 之前,线程不会开始执行。
你会这样调用方法start吗?
r = new Receiver;
t = new QThread();
r->moveToThread(t);
connect(this, &MessageGenerator::messageCompleted, r, &Receiver::onNewMessage);
t->start();
【讨论】:
以上是关于qt 通过将对象移动到跨线程发出信号的主要内容,如果未能解决你的问题,请参考以下文章