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协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...
随机推荐
- java并发包分析之———volitale
首要结论:volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性. 什么是线程的可见性: 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility ...
- NIO 多线程
本文可看成是对Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作.他们都有一个共同的 ...
- 前端技术之_CSS详解第五天
前端技术之_CSS详解第五天 一.行高和字号 1.1 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. <!DOCTYPE html ...
- 菜鸟级Git GitHub创建仓库
菜鸟标准:知道pwd ,rm 命令是什么. 一.Git 是什么. git 是目前世界上最先进的分布式版本控制系统 二.SVN与Git 1.版本控制系统 SVN 是集中式版本控制系统,版本库是集中放在中 ...
- Wex5执行Class[search.login__do] Method[login]失败
====================开发工具版本:WeX5_V3.3======================== 报错背景:大二的时候用这个工具开发了一款APP,备份了项目数据库的SQL文件+ ...
- React+ANTD项目使用后的一些关于生命周期比较实用的心得
1. constructor() constructor(props){ super(props) this.state=({ }) } 一定先写super 可以接收从父组件传来的值 父组件往子组件 ...
- Effective C++ 读书笔记(46-50)
条款四十六:需要类型转换时请为模板定义非成员函数 条款四十七:请使用traits classes 表现类型信息 1.整合重载技术后,traits classes 有可能在编译期对类型执行if...el ...
- 双网卡+mitmproxy+iptables搭建SSL中间人(支持非HTTPS协议)
"想要解决一个问题,最根本方法的就是了解这一切是如何工作的,而不是玄学." --ASCII0X03 最近学习发现现在很多现成的安卓SSL中间人工具和教程都只针对HTTPS流量,比如 ...
- Go 自带的 http/server.go 的连接解析 与 如何结合 master-worker 并发模式,提高单机并发能力
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- 理解矩阵与线性代数<转>
作者:张帅链接:https://www.zhihu.com/question/21082351/answer/34361293来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...