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

【Qt开发】Qt让线程休息一段时间的更多相关文章

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

    前言   使用C#开发动画,绘图性能跟不上,更换方案使用Qt开发Qt的控件制作成OCX以供C#调用,而activex则是ocx的更高级形式.  QtCreator是没有Active控件项目的,所有需要 ...

  2. JAVA中实现让程序等待一段时间的方法

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

  3. 【Qt开发】事件循环与线程 一

    事件循环与线程 一 初次读到这篇文章,译者感觉如沐春风,深刻体会到原文作者是花了很大功夫来写这篇文章的,文章深入浅出,相信仔细读完原文或下面译文的读者一定会有收获. 由于原文很长,原文作者的行文思路是 ...

  4. 【Qt开发】事件循环与线程 二

    事件循环与线程 二 Qt 线程类 Qt对线程的支持已经有很多年了(发布于2000年九月22日的Qt2.2引入了QThread类),Qt 4.0版本的release则对其所有所支持平台默认地是对多线程支 ...

  5. 【Qt开发】QThread 实用技巧、误区----但文档中没有提到

    本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上.1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. ...

  6. 多进程界面开发-Qt试玩儿

    目录 一.概述 二.效果展示 三.使用方法 1.启动外部进程 2.创建Qt窗口 3.加入到主进程布局 四.嵌入NotePad 五.调用Ping命令 六.嵌入其他QWidget窗体 七.相关文章 一.概 ...

  7. Ubuntu 12.04下搭建Qt开发环境

    http://download.qt.io/official_releases/qt/ Ubuntu 环境下Gtk与Qt编译环境安装与配置(系统环境是Ubuntu 12.04) 1.配置基础开发环境G ...

  8. 将vim作为QT开发的IDE

    转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIM ...

  9. Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)

    Qt/C++开发人员眼中的Obj-C      对于我们第一次自己定义iOS应用来说,对于来自Qt/C++开发人员来说,我不得不学习Objective-C相关语法与知识 为了让读者可以更easy理解这 ...

随机推荐

  1. win32创建工具栏的自定义图标

    注意点:使用LoadImage函数加载bmp图片,这里特指BMP图片,其实LoadImage可以加载很多格式的图片 HBITMAP bitmap = (HBITMAP)LoadImage((HINST ...

  2. 【leetcode】1217. Play with Chips

    题目如下: There are some chips, and the i-th chip is at position chips[i]. You can perform any of the tw ...

  3. linux-awk-3

    awk 基础语法 Awk –Fs '/pattern/ {action}' input-file (或者) Awk –Fs '{action}' input-file -F 为字段分界符.如果不指定, ...

  4. Eclipse通过JDBC连接MySQL数据库的步骤(最原始的几个步骤)

    java可以兼容目前市面上所有类型的数据库,主要是因为提供了两个接口,一个用于连接目标数据库,一个用于向数据库中传输SQL命令. Connection接口——连接目标数据库: Statement  接 ...

  5. Prometheus 后续杂记

    在后续prometheus的使用中遇到的一些问题我会在此记录 搭建初期几个问题 rule.yml中对每条告警加上主机名? 要在告警通知中加上故障机器主机名不能从prometheus的采集监控项数据中的 ...

  6. (四)mysql -- 常用函数

    今天get一个,先记录一下 以后慢慢补充~ 将varchar转换成int 例如:select * from tb_1 order by cast(sport_sum as unsigned integ ...

  7. Centos7源码安装jdk

    1. 下载jdk  : jdk-8u211-linux-x64.tar.gz https://www.oracle.com/technetwork/java/javase/downloads/jdk8 ...

  8. keystonejs富文本问题及思考过程

    上一篇讲了keystonejs的环境搭建,helloworld跑起来之后,实际运用中会发现各种问题,今天就说下富文本编辑器的问题(针对后端不熟的同学). 不太熟悉网页嵌入富文本编辑器的同学可能和我一样 ...

  9. 几种常见的CSS布局

    本文概要 本文将介绍如下几种常见的布局: 其中实现三栏布局有多种方式,本文着重介绍圣杯布局和双飞翼布局.另外几种可以猛戳实现三栏布局的几种方法 一.单列布局 常见的单列布局有两种: header,co ...

  10. js中的 for, for in, for of foreach,filter使用

    下面是对数组进行循环 var array = [ { id: , name: 'ohzri', birth: '1999.09.09', city: '湖北', salary: }, { id: , ...