【Qt开发】Qt让线程休息一段时间
Qt 为何没有提供 Sleep
论坛上不时见到有人问:
- Qt 为什么没有提供跨平台的 sleep 函数?
- 使用平台相关的 Sleep 或 nanosleep 以后,界面为什么没有反应?
- QThread 中提供了protected 权限的 sleep 函数,如何用到主线程中?
- 使用 QTest 中的 qSleep,在windows下如何隐藏控制台?
这些问题其实归结为一点:在主线程中使用这些函数是一种错误,这会直接导致界面无法刷新,用户与程序无法交互。
Qt不提供,是因为你不需要在主线程中使用 sleep 函数。
如何让程序等待一段时间QTime
QTime t;
t.start();
while(t.elapsed()<1000);
这种死循环也是一种常见错误用法。但改成正确的还是比较简单的:
QTime t;
t.start();
while(t.elapsed()<1000)
QCoreApplication::processEvents();
不停地处理事件,以使得程序保持响应。
QElapsedTimer
这是Qt4.7引入的新的类,和QTime相比,它提供了更快的计算 elapsed 时间的方法。
QElapsedTimer t;
t.start();
while(t.elapsed()<1000)
QCoreApplication::processEvents();
这是QTest模块提供的等待函数(QTest::qWait)
下面是其源代码(和我们前面的代码很像吧?):
namespace QTest
{
inline static void qWait(int ms)
{
Q_ASSERT(QCoreApplication::instance());
QElapsedTimer timer;
timer.start();
do {
QCoreApplication::processEvents(QEventLoop::AllEvents, ms);
QTest::qSleep(10);
} while (timer.elapsed() < ms);
}
...
其实没什么魔力,对吧?但是因为它QTest模块,所以在程序中我们不要使用它。
配合QTimer使用局部的 eventLoop 也是一个不错的选择。例子:
QEventLoop
QEventLoop eventloop;
QTimer::singleShot(100, &eventloop, SLOT(quit()));
eventloop.exec();
QTimer 和 QBasicTimer
这两个和本文没有什么直接关系,QTimer估计大家都很熟了。而QBasicTimer估计很少有人用。
- 与QTimer相比,QBasicTimer更快速、轻量、底层。
- 与QTimer相比,它不是QObject的派生类。
跨平台的sleep
尽管一开始我们就说了,不需要这个东西。但不排除某种场合下,你确实需要这个东西。如何实现一个跨平台的 sleep 呢?
我们一开始也提到了,QThread类 和 QTest模块都提供了sleep函数,其实我们只需要看看他们的源码就够了:
QTest 模块中的函数很简单(windows下调用Sleep,其他平台调用 nanosleep):
void QTest::qSleep(int ms)
{
QTEST_ASSERT(ms > 0);
#ifdef Q_OS_WIN
Sleep(uint(ms));
#else
struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
nanosleep(&ts, NULL);
#endif
}
摘自:http://blog.sina.com.cn/s/blog_4888f8810100u9rq.html
转载于:https://www.cnblogs.com/huty/p/8518183.html
【Qt开发】Qt让线程休息一段时间相关推荐
- 如何让正在运行的线程暂停一段时间
可以使用Thread类的Sleep()方法让线程暂停一段时间. 需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行.
- Qt开发-QT Widgets
前言 Qt Quick和Qt Widgets这两种技术,官方是强推Qt Quick的. 注意: Qt Widgets使用Python结合PySide2开发的时候,窗口的缩放,内部的组件不会随之缩放,用 ...
- Qt开发-QT Quick
前言 QT Quick和Qt widgets这两种技术,官方是强推QT Quick的. QT Quick中布局一般有如下四种方式, 绝对坐标:x.y.z.width.height.top.left 锚 ...
- Android开发之实现每隔一段时间触发定时器android定时器
老套路看图: 每隔20秒重新触发 实际上实现也很简单我们可以通过android原生自带的定时器完成,说下思路: 1.首先实现android定时器开启触发 2.在定时器结束的方法中再次触发开启定时器即可 ...
- Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113773009 长期持续带来更多项目与技术分 ...
- qt延时 QT中简单的延时办法
来自 http://www.qtgtk.com/qt延时-qt中简单的延时办法/ QEventLoop eventloop; QTimer::singleShot(time, &eventlo ...
- 【Qt】Qt 5.15 LTS长期支持版本
00. 目录 文章目录 00. 目录 01. Qt5.15前言 02. 3D图形抽象API 03. Qt Quick 3D 04. Qt Design Studio 1.5 05. Qt QML 06 ...
- 如何让JAVA程序实现一段时间等待
JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一:通过线程的sleep方法. 1 Thread.currentThread().sleep(1000);在需要程 ...
- java实现程序等待一段时间的代码
JAVA中实现程序等待一段时间的方法 JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 出发点在于:公司有两个服务器,分布式定时任务只是在一个服务器上面运行,为了在服务 ...
最新文章
- 《树莓派Python编程指南》——2.3 小结
- Scrum指南新版发布,再添新概念—Product Goal
- 机器大神 Michael Jordan 教授主题演讲:机器学习——创新视角,直面挑战》
- mysql udf 一次渗透测试
- re.findall 两个连续匹配成功的输出后一个
- php如何让字母加1,如何使用PHP以任何顺序(从12个字母组成6个单词组成一个字母)进行字符搜索?...
- java 8 Stream中操作类型和peek的使用
- angular input和output
- 演练 模拟银行账户业务
- python之使用numpy实现从二维数组中找出行(子数组)为特定值的索引
- JIRA中设置[描述]字段的默认值
- ui设计移动端字体适配_UI设计师设计移动端界面要注意的字体规范有那些?
- 变压器次级输出为0v的原因_加速tensorflow中的Google临时融合变压器2 0
- Python星盘接口、排盘、占星、API功能描述
- Java 发送短信工具类
- 6.Striped64源码解析
- s32k118CAN通信问题
- 【汇正财经】沪指冲高回落,创业板全天领涨
- 过期策略(TTL)与淘汰策略
- 我幼儿园的弟看了都直呼简单的【栈和队列】
热门文章
- android canvas 清空画布,清除canvas画布内容(点擦除+线擦除)
- C++在类中能定义本身类型的成员
- Linux系统有线网络抓包程序
- python flask框架优点_python之全栈(Flask框架)
- 【idea】IDEA中TODO以及FIXME等关键字不高亮显示修复
- 【算法】剑指 Offer 56 - II. 数组中数字出现的次数 II 【重刷】
- 【Https】keytool 导入证书到 本地 Exception: Input not an X.509 certificate
- Spring : lombok : 注解@Slf4j
- 【java】java基础之SPI框架实现-整体设计
- php递归实现层级树状展开,PHP递归实现层级树状展开,php递归层级树状_PHP教程...