尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Qt 定时器放在线程中执行,支持随时开始和停止定时器。
前言因为项目需要定时检查网络中设备是否能连通需要定时去做ping操作若是网络不通则ping花费时间比较久局域网大概4秒钟才能结束当然如果设置超时时间啥的也能很快返回就是会报QProcess提前关闭的警告。此外我想要在设备连接后才去开始定时ping要是断开后则停止定时器停止ping。网上有很多定时器使用线程的例子但是没有讲到可以随时停止和开始的那种本文结合实例使用线程去执行定时器的定时操作。一、定义定时器和线程变量。在头文件中定义#include QTimer #include QThread #include QString #include QProcess /** 监听网线拔出或者wifi断开情况的定时器 ***/ QTimer *detectNetCablePulloutTimer NULL; /** 执行定时器的线程 **/ QThread *detectNetCablePulloutTimerThread NULL; /** 开始检测网线拔出时或者wifi断开时的定时器 **/ void startDetectNetCablePulloutTimer(); /** 停止定时器 **/ void stopDetectNetCablePulloutTimer(); private slots: /** 检测网络连接情况的槽函数在线程中执行 **/ void checkDeviceIsOnline();二、开始定时器、停止定时器以及销毁定时器代码。开始定时器代码void CurrentXXXClass::startDetectNetCablePulloutTimer() { // 先停止确保开始之前是停止状态 stopDetectNetCablePulloutTimer(); if (detectNetCablePulloutTimer NULL) { // 注意构造函数是带this参数的这个必须这么写否则定时器槽函数无法在子线程中执行 detectNetCablePulloutTimerThread new QThread(this); // 注意构造函数是不带this参数的这个必须这么写否则定时器槽函数无法在子线程中执行 detectNetCablePulloutTimer new QTimer(); // 5秒执行一次局域网断开时一般耗时4-5秒 detectNetCablePulloutTimer-setInterval(5000); // 定时操作放在线程中执行 detectNetCablePulloutTimer-moveToThread(detectNetCablePulloutTimerThread); // 定时任务放在线程中执行, 必须指定参数-Qt::DirectConnection connect(detectNetCablePulloutTimer, QTimer::timeout, this, CurrentXXXClass::checkDeviceIsOnline, Qt::DirectConnection); void (QTimer::*pStartFun)() QTimer::start; // 线程开始时调用定时器的开始 connect(detectNetCablePulloutTimerThread, QThread::started, detectNetCablePulloutTimer, pStartFun); // 线程结束时调用定时器的结束所以要停止定时器只要调用线程的quit方法 // 同时防止提示定时器停止和开始不在同一线程错误 connect(detectNetCablePulloutTimerThread, QThread::finished, detectNetCablePulloutTimer, QTimer::stop); } detectNetCablePulloutTimerThread-start(); }停止定时器代码void CurrentXXXClass::stopDetectNetCablePulloutTimer() { if (detectNetCablePulloutTimerThread ! NULL) { // 会调用定时器的stop方法 detectNetCablePulloutTimerThread-quit(); } }销毁定时器在析构函数中执行//销毁指针变量-注意先后顺序 if (detectNetCablePulloutTimerThread ! NULL) { detectNetCablePulloutTimerThread-quit(); detectNetCablePulloutTimerThread-wait(); delete detectNetCablePulloutTimerThread; detectNetCablePulloutTimerThread nullptr; } if (detectNetCablePulloutTimer ! NULL) { // 定时器在线程中创建(父类不是当前类)让对象自己在所属线程销毁 detectNetCablePulloutTimer-deleteLater(); }三、在槽函数中执行耗时操作。此槽函数是在子线程中执行若是执行完后要回到主线程执行某操作则必须通过发送一个信号方式才能达到效果。void CurrentXXXClass::checkDeviceIsOnline() { QString ip 192.168.1.1; // 若是timer使用了线程则此函数在子线程中执行执行比较耗时的操作 QProcess pingProcess; // 不设置-w参数 QString strArg ping ip -n 1 -i 2; // qt 6 开始命令的方法 pingProcess.startCommand(strArg, QIODevice::ReadOnly); // 不带等待时间参数 pingProcess.waitForReadyRead(); // 不带等待时间参数 pingProcess.waitForFinished(); QString p_stdout QString::fromLocal8Bit(pingProcess.readAllStandardOutput()); bool bPingSuccess false; // 通过特殊字符串进行判断ping是否成功 if (p_stdout.contains(TTL)) { // 网络连通 bPingSuccess true; } else { // 网络不通 bPingSuccess false; } }
RELATED

相关推荐

为什么你的AI流程图总被否?揭秘头部大厂评审通过率提升76%的6个隐藏规范

为什么你的AI流程图总被否?揭秘头部大厂评审通过率提升76%的6个隐藏规范

更多请点击: https://kaifayun.com 第一章:AI流程图设计的核心认知与评审逻辑 AI流程图不是视觉装饰,而是系统性思维的具象化表达——它承载着数据流向、模型边界、决策分支与异常处理路径的完整语义。设计者必须同时具备领域建模能力与工程…

📅 2026/9/11 10:18:23
NVM(node版本控制工具)

NVM(node版本控制工具)

1、第一步:如果存在node,请先卸载,在下载安装nvm 2、第二步:nvm的下载链接: nvm-setup.zip 链接:https://pan.baidu.com/s/1LIdT6wdr8QhBuY8AOBtfjw?pwdfine 提取码:fine 安装包全部 github&…

📅 2026/8/22 18:35:04
为什么大厂都在用扣子重构客服系统?拆解某TOP3电商日均50万会话背后的5层智能体编排架构

为什么大厂都在用扣子重构客服系统?拆解某TOP3电商日均50万会话背后的5层智能体编排架构

更多请点击: https://kaifayun.com 第一章:扣子智能体搭建的底层逻辑与价值定位 扣子(Coze)智能体并非传统意义上的静态 Bot,而是基于“意图-动作-上下文”三元驱动模型构建的可编排、可感知、可进化的智能单元。其底…

📅 2026/8/22 18:35:04
MORE NEWS

更多资讯

📰

STC15单片机超声波测距OLED显示实战:从原理到原理图设计

简介:这份面向STC15单片机初学者的超声波测距项目,集成了测距算法、OLED显示与硬件原理图,适用于嵌入式课程设计、竞赛备赛或实际避障模块开发,也可作为毕业设计参考。方案基于IAP15系列8051内核MCU,通过HC-SR04类超声…

📰

C#对象映射实战:反射、特性与表达式树应用

1. 项目背景与核心目标最近在重构一个老旧的.NET项目时,我遇到了一个经典问题:如何在不同的数据模型之间进行高效、安全的属性映射。手动编写每个属性的赋值代码不仅枯燥乏味,还容易出错。这时候很自然地想到了AutoMapper这个业界标杆&#x…

📰

半导体设备技术突破与智能化发展趋势

1. 半导体设备技术突破现状分析最近业内确实出现了一些值得关注的半导体设备技术进展,主要集中在以下几个方向:1.1 光刻技术的新突破在极紫外光刻(EUV)领域,最新的进展包括:光源功率提升至500W以上&#xf…

📰

LTspice元器件库本质:路径、符号与模型三要素协同机制

1. 为什么LTspice导入元器件库是每个仿真老手的“必修课”而不是“选修课”LTspice导入一个元器件库文件——这七个字背后,藏着无数电子工程师、硬件爱好者、学生党在深夜调试电路时摔键盘的真实瞬间。我第一次被逼着搞懂这个操作,是在帮客户复现一个开关…

📰

EITtext_EIT:Python实现行内实体标签解析与转换实战

简介:面向电阻抗成像(EIT)逆问题研究者的完整求解代码包,聚焦吉洪诺夫正则化、Landweber迭代、L1稀疏重构与共轭梯度(CGLS)等经典与前沿算法,适合医学成像、地质探测及无损检测领域的硕博生与工…

📰

Qt+OpenCV+C++实战:从零构建行车辅助系统核心功能

简介:这份完整的行车辅助系统源码基于Qt、OpenCV与C构建,主要面向毕业设计、课程设计及实际项目开发场景,适合具备一定C基础、希望在图形界面与计算机视觉方向深入实践的开发者。整个资源包共279个文件,约48.7MB,其中包…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬