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环境中失效的问题的更多相关文章

  1. spring事务在web环境中失效的问题

    今天温习一下spring事务的时候,出现了一种诡异的现象,在java环境中测试事务是可以的.然后到web下测试事务就没用了.spring.xml配置 spring-mvc.xml配置 后来百度发现是因 ...

  2. 在不开启事件循环的线程中使用QTimer(QThread::run函数自带事件循环,在构造函数里创建线程,是一种很有意思的线程用法) good

    引入 QTimer是Qt自带的定时器类,QTimer运行时是依赖于事件循环的,简单来说,在一个不开启事件循环(未调用exec() )的线程中,QTimer是无法使用的.通过分析Qt源码可发现,调用QT ...

  3. SQL优化:清理生产环境中已失效字段基本步骤

    1.统计相应字段的数据情况(如:几年没更新,无数据等情况) 2.确认产品逻辑已无效(产品经理邮件确认) 3.数据备份 4.将数据清空(置为0或空) 5.测试环境中删除引用页面 6.修改定时程序,存储过 ...

  4. ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们 ...

  5. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

  6. 【原】Storm Local模式和生产环境中Topology运行配置

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  7. 在多任务(RTOS)环境中使用看门狗

    最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章.从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁.为了阅读方便,有些航天领域名词 ...

  8. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  9. ZooKeeper系列(5):管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...

随机推荐

  1. oracle角色、权限和用户

    oracle角色.权限和用户 [转贴 2010-1-25 10:29:45]     字号:大 中 小 Oracle内置角色connect与resource的权限 首先用一个命令赋予user用户con ...

  2. 【转】H.264RTP封包原理

    原文地址:H.264RTP封包原理   作者:cnp11 1.  引言  随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面 ...

  3. Python-网站页面代码获取

    Python3.6 库:urllib3, bs4 主程序是抓取亚马逊图书销售排名数据,但是亚马逊应该是加了反爬虫,拒绝疑似机器人的请求,这部分暂时以百度代替. 其实简单的页面抓取,常用的urllib. ...

  4. 关于Python的那些话

    1.第一个选择:版本2还是3,我选择2,保守谨慎,3的成熟周期会很长2.三种基本的文本操作:     2.1.解析数据并将数据反序列化到程序的数据结构中     2.2.将数据以某种方式转化为另一种相 ...

  5. [译文]Domain Driven Design Reference(一)—— 前言

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. DDD到目前为止知 ...

  6. JS实现数组去重的6种方法总结

    方法一: 双层循环,外层循环元素,内层循环时比较值,如果有相同的值则跳过,不相同则push进数组. Array.prototype.distinct = function(){ var arr = t ...

  7. HTML学习笔记4:文档申明和编码标签

    ①文档申明     作用:为了使浏览器更好的显示HTML文件,必须告知浏览器你的文件为HTML     语法:<!DOCTYPE html> 声明必须放在HTML文档第一行 声明不是HTM ...

  8. margin-right没有效果的问题

    margin-right其实有效果的,只是在默认即标准流的情况的下显示不出来效果.如果脱离标准流呢?想到这个,就立马在css文件中加了一个:float:right;然后在测试的时候就能看到margin ...

  9. 【转】javascript 分号问题

    javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在ja ...

  10. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

    首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...