Qt 所有权问题导致多线程报错

博客探讨了在使用Qt进行多线程编程时遇到的错误,问题源于所有权规则。作者通过实验发现,定时器在主线程中运行而不在工作线程,通过将定时器设置为Worker对象的子部件解决了问题。
摘要由CSDN通过智能技术生成

问题描述,把定时器放在单独线程中使用,想提高精度。

结果报错:

QObject::startTimer: Timers cannot be started from another thread。

这种报错方式,以前刚用多线程时候遇见过。知道原因,所以更疑惑,百思不得其解。

在q群问,集思广益。

1.  多线程没问题, 槽函数是在次线程运行的。

2. 通过在Worker::start函数中直接开启定时器,不报错,证明 定时器在主线程中。

3. 通过在槽函数中创建定时器,并启动,不报错。

4. 最终怀疑是因为定时器不属于Worker,所以worker移到次线程时,定时器还在主线程。将定时器父对象设为Worker,验证确实如此。


代码:

#include <QtCore>
class Worker : public QObject
{
    Q_OBJECT
public:
    Worker(QObject *o=0);
signals:
    void start(int);
private slots:
    void handleStart(int d){ timer.start(d);}
    void onTimeout()
    {
        qDebug()<<"Worker::onTimeout get called from?: "<<QThread::currentThreadId(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值