QT之QTimer详解以及结合多线程中开启定时器的示例

article/2025/9/13 15:55:09

一 QTimer详解
QTimer类提供了重复和单次触发信号的定时器。
a.void timeout ()定时器超时后,这个信号被发射。
b.void start()开启定时器,它的重载函数void start(int msec),启动或重新启动一个超时时间间隔为毫秒的定时器,如果定时器正在运行,它将被停止和重新启动。
c.void stop()停止定时器.
d.void setInterval(int msec)设置超时间隔(毫秒为单位)。

示例:

 	 QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(update()));timer->start(1000);//start之后,每隔一秒触发一次槽函数

注:以前一直以为开启一个定时器就是开启了个线程,好愚蠢的我!
在一个线程内创建了多个定时器,定时器使用时注意其两个特性:
1、定时器之间不是并行处理数据,而是分片占用主线程资源 ,且定时器完成其对应的slot函数任务后,下一个定时器才会开始执行其slot函数任务;

2、当定时器的间隔时间小于其slot函数任务的执行时间时,一旦定时器timeout时,其slot函数不会终止执行,只是暂停,内部变量仍然保存,而后继续执行。

所以开启一个定时器并不等于开启了个线程

想知道时间片是什么的小伙伴可以看看这个 CPU时间分片、多线程、并发和并行

二 在多线程中开启定时器的示例
示例:达到的效果,开启多个线程执行同一个耗时的操作,每个线程里,每隔多少时间去执行这个操作.

	//调用示例QTimerThread *testObject = new QTimerThread(1);//创建几个线程testObject->createItem();//调用开始创建线程的函数testObject->startMultThread();//开启线程的函数

.h

#ifndef QTIMERTHREAD_H
#define QTIMERTHREAD_H
#include <QThread>
#include <QList>
#include <QTimer>
#include "tcpclient.h"
class QTimerThread : public QObject
{Q_OBJECT
public:QTimerThread(int iCount);~QTimerThread();void createItem();void startMultThread();
public slots:void update();
private:int m_iThreadCount;//开启的线程个数QList<QTimer*> m_qTimerList;QList<QThread*> m_threadList;    
};#endif // QTIMERTHREAD_H

.cpp

#include "qtimerthread.h"
#include <QDebug>
QTimerThread::QTimerThread(int iCount)
{m_iThreadCount = iCount;
}QTimerThread::~QTimerThread()
{//对象的销毁顺序也很重要for(int i = 0; i < m_iThreadCount; i++){m_threadList.value(i)->quit();m_threadList.value(i)->wait();m_qTimerList.value(i)->deleteLater();m_threadList.value(i)->deleteLater();}
}void QTimerThread::createItem()
{for(int i = 0;i < m_iThreadCount;i++){QTimer *timer = new QTimer();QThread  *thread = new QThread();m_qTimerList.append(timer);m_threadList.append(thread);}
}void QTimerThread::startMultThread()
{for(int i = 0; i < m_qTimerList.size(); i++){//划重点的部分/*注:好像还有其他方式可以实现比如把定时器的开启放在connect里面,感兴趣的小伙伴可以试一试换换顺序这些的是什么效果,我当时好像都试了一遍,但是可能是这种方法比较容易理解且不出错才采用了,实践出真知。*/m_qTimerList.value(i)->start(5000);m_qTimerList.value(i)->moveToThread(m_threadList.value(i));QObject::connect(m_qTimerList.value(i),SIGNAL(timeout()),this,SLOT(update()),Qt::QueuedConnection);m_threadList.value(i)->start(); 		}
}void QTimerThread::update()
{//这里放需要耗时的操作      
}

注:定时器的开启要放在最前面,不然会报错
在这里插入图片描述
翻译:QObject::startTimer: QTimer只能用于以QThread启动的线程

注意:
1)QTimer 不能指定parent, 否则 会出现警告 " QObject::moveToThread: Cannot move objects with a parent"。 因为moveToThread 无法移动有parent的object.
2) QTimer 需要用moveToThread 来改变线程相关性. 这样emit signal的时候才会在工作线程.
3)定时器的创建和开启只能在同一个线程中,不然就会报上面的那种错误。

或许你会感兴趣的内容:
Qt封装一个类管理moveToThread( )正确的开启多线程、安全的退出线程的实例

总结:QT 多线程(处理密集时的界面响应保持)注:这里面有讲moveToThread开启线程的方法,很详细了
QT-TCP服务端开启多个线程处理收到多客户端发来的消息示例


http://chatgpt.dhexx.cn/article/W8BaBS5c.shtml

相关文章

Qt 之 QTimer

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 QTimer类提供了重复和单次触发信号的定时器。 QTimer类为定时器提供了一个高级别的编程接口。很容易使用&#xff1a;首先&#xff0c;创建一个QTimer&#xff0c;连接timeo…

DEV、SIT、UAT、PET、SIM、PRD、PROD缩写介绍

按开发、测试、上线的时间线排序&#xff1a; DEV Development 研发环境 SIT System Integrate Test 系统集成测试环境&#xff08;内测&#xff09; UAT User Acceptance Test 用户验收测试环境 PET Performance Evaluation Test 性能评估测试环境&#xff08;压测&#xff0…

什么是SIT, UAT测试

2019独角兽企业重金招聘Python工程师标准>>> SIT测试 SIT(System Integration Testing)系统集成测试&#xff0c;也叫做集成测试&#xff0c;是软件测试的一个术语&#xff0c;在其中单独的软件模块被合并和作为一个组测试。它在单元测试以后和在系统测试之前。集成…

UAT测试和SIT测试的区别

区别如下&#xff1a; 1、UAT:终端用户集成测试&#xff0c;主要是要求用户参与进测试流程&#xff0c;并得到用户对软件的认可&#xff0c;鼓励用户自己进行测试设计和进行破坏性测试&#xff0c;充分暴露系统的设计和功能问题&#xff0c;显然&#xff0c;用户的认可和破坏性…

UT-FT-ST测试

单元测试(UT)、功能测试(FT)&#xff1a; 目的&#xff1a;1、尽量避免写的代码测试人员频繁的来找你其他地方又出问题了&#xff1b;2、提供的接口不可用&#xff1b;3、一个bug修复了引入了其他的bug或者其他用例变红了&#xff1b; 理解&#xff1a;在实现函数功能的时候编…

unittest教程__测试报告(6)

用例执行完成后&#xff0c;执行结果默认是输出在屏幕上&#xff0c;其实我们可以把结果输出到一个文件中&#xff0c;形成测试报告。 unittest自带的测试报告是文本形式的&#xff0c;如下代码&#xff1a; import unittestif __name__ __main__:# 识别指定目录下所有以tes…

Pytest 分组测试

有时候需要针对不同的测试环境跑不同的测试用例&#xff0c;如&#xff1a;冒烟测试、sit、uat、prd&#xff0c;所以给自动化测试用例做标记分组是很有必要的&#xff0c;pytest.mark 可以轻松实现这个功能。首先需要注册自定义标记。 通过使用pytest.mark帮助程序&#xff0…

冒烟测试回归测试UATSIT

在软件研发中&#xff0c;冒烟测试其实是微软首先提出来的一个概念&#xff0c;和微软一直提倡的每日build&#xff08;构建版本&#xff09;有很密切的联系。具体说&#xff0c;冒烟测试就是在每日build&#xff08;构建版本&#xff09;建立后&#xff0c;对系统的基本功能进…

使用GIT提交代码流程

安装步骤&#xff1a;双击Git-2.27.0-64-bit.exe安装 双击TortoiseGit-2.10.0.2-64bit.msi安装 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 登陆复制仓库的地址然后复制到下图的Directory…

Git提交代码的流程

企业级项目git远程仓库一般是由master/test/dev三个分支构成&#xff0c;开发人员是在dev上做开发&#xff0c;当需要发布测试环境或者生产环境时管理员会把开发人员提交的代码合并到test或者master上。 开发人员git操作步骤&#xff1a; 1.git clone 把远程dev上的代码克隆到本…

傻瓜式Git提交代码流程【写给初学者】

前言 Git是程序员工作中最最常用的分布式版本控制系统&#xff0c;为的就是解决那种多人协作、多次修改的问题&#xff0c;虽说Git可以应用于各行各业&#xff0c;但是实际上还是程序员用的最多了&#xff0c;应该说是程序员的必备技能之一了&#xff0c;如果你还不会Git&…

vs2019中git提交代码的步骤

目录 前言 一、在vs2019的git界面提交代码 二、使用git命令行提交代码 总结 前言 在vs2019中使用git提交代码的步骤和一些常见问题。 一、在vs2019的git界面提交代码 1.切换到需要提交代码的分支上&#xff0c;首先更新分支。 vs2019工具栏选择Git&#xff0c;点击更新。 2.…

IDEA使用git提交代码

1.将鼠标移动到需要提交的代码文件上&#xff1b;2.右键文件夹&#xff0c;找到Git选项&#xff1b;3.进入选项中的Repository&#xff1b;4.然后点击push就可以将暂存的代码提交到 Git 服务器上。

在Idea用Git提交代码

前提是安装了Git 1、右键选择如下&#xff1a; 2、选择提交前文件、描述提交信息、提交到本地仓库&#xff0c;操作如下&#xff1a; 3、确定是否提交 4、推送远程仓库&#xff0c;右键选择如下&#xff1a;

idea上git提交代码的正确步骤

IDEA中项目集成git提交代码详细步骤 一&#xff1a;pull代码 在提交代码之前&#xff0c;我们必须先对代码就行更新操作&#xff0c;这一步非常重要&#xff0c;如果不进行更新代码操作&#xff0c;当有其他小伙伴有更改的内容已经提交到代码仓库但是我们本地缺没有更新的话&…

idea中使用git提交代码步骤

目录 一、先更新代码二、更新代码后的2种情况三、代码添加到本地仓库四、代码提交到缓冲区五、代码提交到远程git仓库 lz部分截图参考此链接https://blog.csdn.net/u013452337/article/details/79956604 一、先更新代码 1、在提交项目之前必须先对项目进行更新&#xff08;一定…

Git命令提交代码步骤

1.初始化&#xff1a;创建一个git仓库&#xff0c;创建之后就会在当前目录生成一个.git的文件 git init2.添加文件&#xff1a;把文件添加到缓冲区 git add filename3.添加所有文件到缓冲区&#xff08;从目前掌握的水平看&#xff0c;和后面加“.”的区别在于&#xff0c;加…

idea git提交代码

0、新工程如何加入git管理 复制.gitignore文件进工程根目录 .gitignore文件内容为&#xff1a; HELP.md target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/### STS ### .apt_generated .classpath .factorypath .project .settings…

Git 提交代码步骤总结

第一步:拉取远程代码&#xff0c;更新本地代码&#xff0c;避免覆盖其他人的代码 指令&#xff1a;git pull &#xff08;拉取远程master分支的代码&#xff09; 截图&#xff1a; 指令: git pull origin cas (拉取远程cas分支的代码) 截图: 第二步&#xff1a;查看当前项目…

Git 提交代码步骤

第一步&#xff1a; 提交代码第一步&#xff1a;git status 查看当前状态 当你忘记修改了哪些文件的时候可以使用 git status 来查看当前状态&#xff0c; 红色的字体显示的就是你修改的文件。 第二步: 提交代码第二步&#xff1a;git add . 或者 git add xxx 如图1、如…