QObject::killTimer: timers cannot be stopped from another thread

原因:出现这个错误的原因在于在次线程中执行主线程对象的一些操作引起的

使用定时器的注意事项

  1. 不能跨线程启动定时器和停止定时器。
  2. 不能跨线程启动一个定时器关联的对象,但在另一个线程释放此定时器关联的对象,即定时器相关的逻辑和对象只能用在一个线程中。

例子分析:

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
#include "autosampleservice.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void Init();
private slots:void on_btnStop_clicked();
signals:void sigStop();void sigInit();
private:Ui::MainWindow *ui;AutoSampleService *pAutoSampleService=nullptr;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QThread>
#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug()<<"MainWindow----current thread id:"<<QThread::currentThreadId()<<endl;pAutoSampleService=new AutoSampleService();connect(this,SIGNAL(sigInit()),pAutoSampleService,SLOT(SlotInit()),Qt::QueuedConnection);connect(this,SIGNAL(sigStop()),pAutoSampleService,SLOT(Stop()),Qt::QueuedConnection);Init();
}
void MainWindow::Init()
{QThread *t=new QThread();pAutoSampleService->moveToThread(t);t->start();//emit sigInit();pAutoSampleService->SlotInit();
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::on_btnStop_clicked()
{emit sigStop();
}
//autosampleservice.h
#ifndef AUTOSAMPLESERVICE_H
#define AUTOSAMPLESERVICE_H
#include<QTimer>
#include<QObject>class AutoSampleService:public QObject
{Q_OBJECT
public:AutoSampleService();
public slots:void SlotInit();void RecvTimeOut();void Stop();
private:QTimer* RecvTimer=nullptr;};#endif // AUTOSAMPLESERVICE_H
#include "autosampleservice.h"
#include<QThread>
#include<QDebug>AutoSampleService::AutoSampleService()
{}
void AutoSampleService::SlotInit()
{qDebug()<< "AutoSampleService Init----current thread id:"<<QThread::currentThreadId()<<endl;RecvTimer=new QTimer();RecvTimer->start(5000);connect(RecvTimer,SIGNAL(timeout()),this,SLOT(RecvTimeOut()));
}
void AutoSampleService::RecvTimeOut()
{qDebug()<< "RecvTimeOut----current thread id:"<<QThread::currentThreadId()<<endl;
}
void AutoSampleService::Stop()
{qDebug()<< "AutoSampleService Stop----current thread id:"<<QThread::currentThreadId()<<endl;RecvTimer->stop();
}

点击停止按钮后,运行结果如下:

原因分析

因pAutoSampleService->SlotInit() 主线程中直接调用SlotInit函数创建RecvTimer定时器,即RecvTimer定时器启动在主线程;当点击停止按钮后,在子线程进行RecvTimer定时器停止操作

解决方法:

调整上述代码

void MainWindow::Init()
{QThread *t=new QThread();pAutoSampleService->moveToThread(t);t->start();emit sigInit();
}

运行正常:

QTimer定时器问题分析相关推荐

  1. QObject::startTimer: Timers cannot be started from another thread [使用自定义信号与曹函数来解决在子线程中不能调用QTimer定时器]

    使用自定义信号与曹函数来解决在子线程中不能调用QTimer定时器 报错: QObject::startTimer: Timers cannot be started from another thre ...

  2. QTimer定时器的使用,判断ros是否关闭,ros关闭后关闭窗口

    QTimer定时器的使用,判断ros是否关闭,ros关闭后关闭窗口 c++ #include <QApplication> #include <ros/ros.h> #incl ...

  3. 2.6.4 Qtimer定时器介绍

    2.6.4 Qtimer定时器介绍 QTimer类提供了定时器功能,在指定的时间超时之后可以发出超时信号,可以单次或者重复定时. QTimer使用方法比较简单:先创建一个QTimer定时器,使用sta ...

  4. μC/OS-II软件定时器的分析与测试

     引 言 μC/OS-II操作系统是建立在微内核基础上的实时操作系统,抢占式多任务.微内核.移植性好等特点,使其在诸多领域都有较好的应用. 在μC/OS-II 2.83及其以后的版本中,一个较大的 ...

  5. QT QTimer定时器显示系统时间倒计时功能

    QT定时器显示系统时间倒计时功能 lcdNumber控件显示 QTimer::singleShot(10000,this,&MainWindow6_6::close);//10秒后窗口自动关闭 ...

  6. 网络编程 高性能定时器数据结构分析 | 时间轮 红黑树定时器性能分析 | 为什么要做用户态定时器

    为什么要用户态的定时器? 首先是为什么要做定时器,定时器的主要说的是我们的应用(业务?功能?总之有这个需求)要做一个定时的任务.其实如果不想为什么,好像是理所当然的.我写这个的时候,知乎有一个问题(L ...

  7. JavaScript定时器原理分析

    JavaScript中的定时器大家基本在平时的开发中都遇见过吧,但是又有多少人去深入的理解其中的原理呢?下面我们就来分析一下定时器的实现原理. 一.储备知识 在我们在项目中一般会遇见过这样的两种定时器 ...

  8. Qt之QTimer(定时器)

    QTimer在界面中不可见,在UI设计器中也找不到它,只能通过纯代码实现,主要作用是定时特定的时间. 想要掌握QTimer只需掌握setInterval(设置定时时间,单位ms).start(启动定时 ...

  9. QTimer 定时器

    QTimer类为我们提供了一个即可重复触发又可单次触发的定时器.它是一个高层次的应用程序接口.要使用它,只需创建一个QTimer类对象,将它的timeout()信号连接到适当的函数上,然后调用其sta ...

最新文章

  1. PCB 内网实现《OCR文字识别》实现逻辑
  2. 从工程转向管理,访谈Github公司的Phil Haack
  3. svg载入html,SVG系列教程:SVG简介与嵌入HTML页面的方式
  4. MySQL根据员工姓名所在部门_用一条SQL语句显示所有人员的姓名及所在部门
  5. 面试准备每日五题:C++(二)——mallocnew、宏、volatile、constvolatile、(a)和(a)
  6. 详细解读Android中的搜索框(二)—— Search Dialog
  7. 码头结构计算机辅助设计软件,空间结构分析软件MST2016 官方版
  8. 为什么当函数值为定值时,梯度垂直于等值面?
  9. 2020-01-02 bibtex生成的参考文献如何转为thebibliography
  10. 工业大数据:中国智造下的“数字新基建”
  11. 花 作品php,《不谢之花》作品赏析
  12. 软件测试灵魂三问,如何回怼?
  13. 基础内网信息探针思路
  14. 基于SpringBoot的城市建设用地管理系统的设计与实现
  15. Git笔记(6) 查看提交历史
  16. python的out模式_Python设计模式之状态模式
  17. uniapp+egg.js获取微信步数(wx.getWeRunData)
  18. 微信小程序,分享如何封装一个全局支持暂停,拖动等各类操作的音视频等多媒体管理器
  19. 双非研二师弟的春招总结和实习感悟
  20. QT实现的自定义按键精灵

热门文章

  1. 用层次分析法建模解决交通问题论文
  2. 消防人员实操训练模拟培训虚拟仿真实训系统软件
  3. 计算机 教案,计算机教案.doc
  4. 机器学习--sklearn之决策树(分类+回归)
  5. scala的futue和promise
  6. Centos8(Liunx) 中安装PHP7.4 的三种方法和删除它的三种方法
  7. 微信小程序之toast等弹框提示
  8. 方舟服务器维护公告11月19日,《方舟指令》11月29日维护公告
  9. 阿里巴巴2014校园招聘算法题
  10. 游戏设计的作品集到底该怎么做?