Qt 为何没有提供 Sleep

论坛上不时见到有人问:

  1. Qt 为什么没有提供跨平台的 sleep 函数?
  2. 使用平台相关的 Sleep 或 nanosleep 以后,界面为什么没有反应?
  3. QThread 中提供了protected 权限的 sleep 函数,如何用到主线程中?
  4. 使用 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让线程休息一段时间相关推荐

  1. 如何让正在运行的线程暂停一段时间

    可以使用Thread类的Sleep()方法让线程暂停一段时间. 需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行.

  2. Qt开发-QT Widgets

    前言 Qt Quick和Qt Widgets这两种技术,官方是强推Qt Quick的. 注意: Qt Widgets使用Python结合PySide2开发的时候,窗口的缩放,内部的组件不会随之缩放,用 ...

  3. Qt开发-QT Quick

    前言 QT Quick和Qt widgets这两种技术,官方是强推QT Quick的. QT Quick中布局一般有如下四种方式, 绝对坐标:x.y.z.width.height.top.left 锚 ...

  4. Android开发之实现每隔一段时间触发定时器android定时器

    老套路看图: 每隔20秒重新触发 实际上实现也很简单我们可以通过android原生自带的定时器完成,说下思路: 1.首先实现android定时器开启触发 2.在定时器结束的方法中再次触发开启定时器即可 ...

  5. Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113773009 长期持续带来更多项目与技术分 ...

  6. qt延时 QT中简单的延时办法

    来自 http://www.qtgtk.com/qt延时-qt中简单的延时办法/ QEventLoop eventloop; QTimer::singleShot(time, &eventlo ...

  7. 【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 ...

  8. 如何让JAVA程序实现一段时间等待

    JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一:通过线程的sleep方法. 1 Thread.currentThread().sleep(1000);在需要程 ...

  9. java实现程序等待一段时间的代码

    JAVA中实现程序等待一段时间的方法 JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 出发点在于:公司有两个服务器,分布式定时任务只是在一个服务器上面运行,为了在服务 ...

最新文章

  1. 《树莓派Python编程指南》——2.3 小结
  2. Scrum指南新版发布,再添新概念—Product Goal
  3. 机器大神 Michael Jordan 教授主题演讲:机器学习——创新视角,直面挑战》
  4. mysql udf 一次渗透测试
  5. re.findall 两个连续匹配成功的输出后一个
  6. php如何让字母加1,如何使用PHP以任何顺序(从12个字母组成6个单词组成一个字母)进行字符搜索?...
  7. java 8 Stream中操作类型和peek的使用
  8. angular input和output
  9. 演练 模拟银行账户业务
  10. python之使用numpy实现从二维数组中找出行(子数组)为特定值的索引
  11. JIRA中设置[描述]字段的默认值
  12. ui设计移动端字体适配_UI设计师设计移动端界面要注意的字体规范有那些?
  13. 变压器次级输出为0v的原因_加速tensorflow中的Google临时融合变压器2 0
  14. Python星盘接口、排盘、占星、API功能描述
  15. Java 发送短信工具类
  16. 6.Striped64源码解析
  17. s32k118CAN通信问题
  18. 【汇正财经】沪指冲高回落,创业板全天领涨
  19. 过期策略(TTL)与淘汰策略
  20. 我幼儿园的弟看了都直呼简单的【栈和队列】

热门文章

  1. android canvas 清空画布,清除canvas画布内容(点擦除+线擦除)
  2. C++在类中能定义本身类型的成员
  3. Linux系统有线网络抓包程序
  4. python flask框架优点_python之全栈(Flask框架)
  5. 【idea】IDEA中TODO以及FIXME等关键字不高亮显示修复
  6. 【算法】剑指 Offer 56 - II. 数组中数字出现的次数 II 【重刷】
  7. 【Https】keytool 导入证书到 本地 Exception: Input not an X.509 certificate
  8. Spring : lombok : 注解@Slf4j
  9. 【java】java基础之SPI框架实现-整体设计
  10. php递归实现层级树状展开,PHP递归实现层级树状展开,php递归层级树状_PHP教程...