QTimer在QThread环境中失效的问题
QTimer在非QThread的环境下能正常工作。但在QThread环境下,需要做一些改动才能正常工作。
创建Qt的线程有两种方式:
1. 子例化QThread
可以在虚函数run中启动定时器,大致的代码如下:
//构造函数,继承QThread
Thread::Thread(QObject *parent)
: QThread(parent)
{ } void Thread::run()
{
QTimer* timer = new QTimer; //多线程环境中,此处设父指针为this,会导致创建线程失败,定时器可用
connect(timer, SIGNAL(timeout()), this, SLOT(display()));
timer->start();
exec(); //开启事件循环
} //调用,启动线程
Thread* thread = new Thread; //此处设父指针为this,关闭应用程序时会发生崩溃
thread->start();
两处指针new的时候不能加this指针,run函数中必须加exec函数。
很不理解Qt为什么会这么干???
2. 继承QObject,使用moveToThread移入线程
大致的代码如下:
Calc::Calc(int start, int step)
: m_cur(start)
, m_step(step)
{
QThread* thread = new QThread;
moveToThread(thread);
thread->start(); QTimer* timer = new QTimer; //多线程环境中,此处设父指针为this,会导致创建线程失败,定时器可用
connect(timer, SIGNAL(timeout()), this, SLOT(display()));
timer->start();
} Calc* c = new Calc(, );
构造函数内两处指针new的时候,也不能加this
具体的代码如下:
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QThread> QT_BEGIN_NAMESPACE class QTimer;
class Thread; class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = );
~Widget();
}; class Thread : public QThread
{
Q_OBJECT
public:
Thread(QObject* parent = nullptr); public slots:
void display(); protected:
void run();
}; class Calc : public QObject
{
Q_OBJECT
public:
Calc(int start, int step); public slots:
void display(); private:
int m_cur;
const int m_step;
}; QT_END_NAMESPACE #endif // WIDGET_H #include "widget.h" #include <QTimer>
#include <QDebug> Widget::Widget(QWidget *parent)
: QWidget(parent)
{
/*
Thread* thread = new Thread; //此处设父指针为this,关闭应用程序时会发生崩溃
thread->start();
*/ Calc* c = new Calc(, );
Q_UNUSED(c);
} Widget::~Widget()
{ } //构造函数,继承QThread
Thread::Thread(QObject *parent)
: QThread(parent)
{ } void Thread::display()
{
qDebug() << "running in thread";
} void Thread::run()
{
QTimer* timer = new QTimer; //多线程环境中,此处设父指针为this,会导致创建线程失败,定时器可用
connect(timer, SIGNAL(timeout()), this, SLOT(display()));
timer->start();
exec(); //开启事件循环
} Calc::Calc(int start, int step)
: m_cur(start)
, m_step(step)
{
QThread* thread = new QThread;
moveToThread(thread);
thread->start(); QTimer* timer = new QTimer; //多线程环境中,此处设父指针为this,会导致创建线程失败,定时器可用
connect(timer, SIGNAL(timeout()), this, SLOT(display()));
timer->start();
} void Calc::display()
{
qDebug() << m_cur;
m_cur += m_step;
}
QTimer在QThread环境中失效的问题的更多相关文章
- spring事务在web环境中失效的问题
今天温习一下spring事务的时候,出现了一种诡异的现象,在java环境中测试事务是可以的.然后到web下测试事务就没用了.spring.xml配置 spring-mvc.xml配置 后来百度发现是因 ...
- 在不开启事件循环的线程中使用QTimer(QThread::run函数自带事件循环,在构造函数里创建线程,是一种很有意思的线程用法) good
引入 QTimer是Qt自带的定时器类,QTimer运行时是依赖于事件循环的,简单来说,在一个不开启事件循环(未调用exec() )的线程中,QTimer是无法使用的.通过分析Qt源码可发现,调用QT ...
- SQL优化:清理生产环境中已失效字段基本步骤
1.统计相应字段的数据情况(如:几年没更新,无数据等情况) 2.确认产品逻辑已无效(产品经理邮件确认) 3.数据备份 4.将数据清空(置为0或空) 5.测试环境中删除引用页面 6.修改定时程序,存储过 ...
- ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据
引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- 【原】Storm Local模式和生产环境中Topology运行配置
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
- 在多任务(RTOS)环境中使用看门狗
最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章.从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁.为了阅读方便,有些航天领域名词 ...
- 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)
原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
- ZooKeeper系列(5):管理分布式环境中的数据
引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...
随机推荐
- CSS布局之--各种居中
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- Mybatis 系列9
上篇系列8中 简单介绍了mybatis的查询,至此,CRUD都已讲完. 本文将介绍mybatis强大的动态SQL. 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方 ...
- 各种代码版本控制工具下使用http代理的方法
原文:各种SCM工具下使用http代理下载源码:http://www.linuxeden.com/html/develop/20090723/66951.html SCM是软件配置管理的简称,常见的S ...
- (原创)ubuntu 10.04+ruby1.9.2+rails3 安装记录
第一步当然是现在ruby 1.9.2 的sourcecode了,因为现在的ubuntu 源中还没有1.9.2的版本 我下载的是ruby-1.9.2-p290.tar.gz 然后解压到/usr/loca ...
- python的统一编码规范
请注意这一点:没有编码规范的代码没有阅读价值,也更谈不上复用. 目前业界比较流行的Python的编码规范目前主要有PEP8的编程.Google的编码风格.Python Guide和Pocoo Styl ...
- udp客户端收发数据流程
1.创建客户端socket开始进行通讯.2.这时服务端应该先启动,并在知道服务端的ip以及端口号的时候才能进行通讯.3.本地不需要绑定ip以及端口号,在用此套接字对象发送消息的时候会自动分配活动端口( ...
- Page.ClientScript.RegisterStartupScript用法小结
使用类型.键.脚本文本和指示是否添加脚本标记的布尔值向 Page 对象注册启动脚本. 参数 type 要注册的启动脚本的类型. key 要注册的启动脚本的键. script 要注册的启动脚本文本. a ...
- 关于HTML、CSS、JavaScript三者关系的简述
总述 我对于网页这部分的理解吧,对于静态网页来说,无非分为三部分:第一部分.HTML,第二部分.CSS,第三部分.JavaScript(这部分暂且放一边).这俩个给我的第一印象就是,这你妹的都是一串串 ...
- swagger上传文件并支持jwt认证
背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...
- 【Android学习笔记】Android Studio简单断点调试
首先点击断点调试按钮运行App 启动之后,会弹出如下图的提示框,不要管,几秒之后这个弹框会自动消失,然后App会成功运行. 下面介绍一下断点调试的相关操作按钮对应的功能: 按钮1的功能:从当前断点跳到 ...