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协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...
随机推荐
- HashMap 实现原理
深入Java集合学习系列:HashMap的实现原理 参考文献 引用文献:深入Java集合学习系列:HashMap的实现原理,大部分参考这篇博客,只对其中进行稍微修改 自己曾经写过的:Hashmap ...
- oracle 11g杀掉锁的sql
oracle 11g杀掉锁的sql [引用 2013-3-6 17:19:12] 字号:大 中 小 --查询出出现锁的session_idselect session_id from v$lo ...
- 动态规划 Common Subsequence
描述 A subsequence of a given sequence is the given sequence with some elements (possible none) left o ...
- 【转】学习FFmpeg API – 解码视频
ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...
- Install OpenCV 3.0 and Python 2.7+ on Ubuntu
为了防止原文消失或者被墙,转载留个底,最好还是去看原贴,因为随着版本变化,原贴是有人维护升级的 http://www.pyimagesearch.com/2015/06/22/install-Open ...
- Java获取当日的起始时间,结束时间,现在时间,是否在时间段中。
当日的起始时间 public static Date getTodayStartTime() { Calendar todayStart = Calendar.getInstance(); today ...
- Node笔记二
### 安装包的方式安装 - 安装包下载链接: + Mac OSX: [darwin](http://npm.taobao.org/mirrors/node/v5.7.0/node-v5.7.0.pk ...
- linux 文件传输 SCP
SCP :secure copy (remote file copy program) 也是一个基于SSH安全协议的文件传输命令.与sftp不同的是,它只提供主机间的文件传输功能,没有文件管理的功能. ...
- .net自定义错误页面实现升级篇
问题描述: 在上一篇博文 ".net自定义错误页面实现" 中已经介绍了在.net中如何实现自定义错误页面实现(有需要者可以去上一篇博文了解),单纯按照上一篇博文那样设置,能够实现所 ...
- python 关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)
一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname&quo ...