QObject::startTimer: timers cannot be started from another thread 一则输出调试:关于QT的线程关联性
开始
今天在调试输出里看见QObject::startTimer: timers cannot be started from another thread
QTimer类
从Qt的帮助文档里可以得到他的使用方法。
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
更多的可以查阅官方帮助,本文是一次多线程的错误使用的记录
QTimer类在多线程中的使用
一次错误的示例
在线程类中定义定时器,然后在run()中调用定时器。
于是输出会提醒你->QObject::startTimer: timers cannot be started from another thread
--------------------------------------------定时器不能在另一个线程里被启用。
首先,每一个QObject实例中,接受信号或者事件时,槽函数或者事件处理器将在对象所处的线程中执行。
然后,这个定时器是在线程类的构造函数中,我们在主进程中实例创建了一个对象,所以定时器是在主进程中的,而start()在线程中调用,所以会报错。
另一些正确的使用
- 在TestThread线程启动后创建定时器
- 线程在主进程中实例化,他的子对象也需要在主进程里创建,不能指定定时器的父对象为子线程。
- 要使用事件循环exec(),否则线程会立即结束,并发出finished()信号。
- stop()也需要在线程中调用。
- 在主进程中创建,然后使用moveToThread()方法改变定时器所处的线程,不要给定时器设置父类,否则该函数将不会生效。
QObject::startTimer: timers cannot be started from another thread 一则输出调试:关于QT的线程关联性的更多相关文章
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- Qt经典—线程、事件与Qobject
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- QThread 与 QObject的关系
Threads and QObjects QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信 ...
- QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)
QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...
- 【QT】子类化QObject+moveToThread实现多线程
往期链接: <QThread源码浅析> <子类化QThread实现多线程> 从往期<QThread源码浅析>可知,在Qt4.4之前,run 是纯虚函数,必须子类化Q ...
- Qt——线程与定时器
一.定时器QTimer类 The QTimer class provides repetitive and single-shot timers. The QTimer class provides ...
- 为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)
为何只能在其关联的线程内启动timer? 在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到: QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器 ...
- 【QT】 Qt多线程的“那些事”
目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...
- Qt: QTimer和QThread
让QTimer 跑在其他线程. 一般写法如下. 1. 在main thread中为worker thread指定定时器. QThread* thread = new QThread(this); th ...
随机推荐
- 通过Cloudflare开启全站https
Cloudflare 添加域名后,会自动生成通用证书,快速开启全站HTTPS,服务端不用做任何修改,还可以选择多种开启模式 一.注册Cloudflare账号 直接打开网站:https://www.cl ...
- Envoy:TLS双向认证
环境准备 主机 角色 数量 front-envoy front envoy 1 service envoy 作为内部后端的envoy 2 end 后端应用程序 2 访问 / front-envoy = ...
- [Java] 数据分析--数据预处理
数据结构 键-值对:HashMap 1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.util. ...
- workbench msvcr120.dll 文件缺失问题
开始以为是dll文件缺失,后来下载了好几个版本的替换到system32文件夹下.依然不起作用. 后来看到解决办法了,原文在此:http://forums.mysql.com/read.php?169, ...
- yml配置从nacos配置中心取数据(单个或多个)
读取单个文件 spring: application: name: test-server cloud: nacos: config: server-addr: localhost:8848 name ...
- ffmpeg安装之mac安装
转发自白狼栈:查看原文 关于ffmpeg的安装,有的人可能要折腾很久,甚至折腾一个礼拜,究其原因,基本都是编译安装惹的祸. 我们提供4种安装方式,最复杂的莫过于centos7上的编译安装. ffmpe ...
- 第13讲 | 套接字Socket:Talk is cheap, show me the code
第13讲 | 套接字Socket:Talk is cheap, show me the code 基于 TCP 和 UDP 协议的 Socket 编程.在讲 TCP 和 UDP 协议的时候,我们分客户 ...
- mysql-redis连接
# log 数据库连接 class LogMysql(object): conn = None cursor = None def __init__(self): self.conn = pymysq ...
- GO学习-(7) Go语言基础之流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...
- Python+Selenium - 窗口切换
当有新窗口出现时,并要在新窗口操作,步骤: 1.产生新窗口 2.获取所有窗口的句柄:driver.window_handles 3.切换函数:driver.switch_to.window(新窗口句柄 ...