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. No application found. Either work inside a view function or push an application context.

    flask报了这个错,字面意思是说没有应用上下文,字面给的解决意见是要么放置在一个视图内,要么提供一个应用(flask)上下文. 查看文档发现文档给了个解决方案: 一个是通过app.app_conte ...

  2. pyinstaller 打包工具的使用方法

    pyinstaller的安装 下载后可以输入pip list查看是否安装成功 然后切换到项目的根目录输入 pyinstaller -i favicon.ico -w -c game.py -p Que ...

  3. Ubuntu安装DroidCamX网络摄像头

    1.安装依赖项 sudo apt-get install gcc make linux-headers-`uname -r` 2.安装 cd /tmp/ bits=`getconf LONG_BIT` ...

  4. 上传图片,正在加载,loading

    https://blog.csdn.net/yansong_8686/article/details/50361573

  5. html中checkbox自定义样式(css版本)

    <span class="choose"><input type="checkbox" class="input_check&quo ...

  6. 基于Ubuntu 搭建 WordPress 个人博客 - 开发者实验室 - 腾讯云

    1.准备 LAMP 环境 安装 Apache2 在终端输入该命令 ,使用 apt-get 安装 Apache2: sudo apt-get install apache2 -y 安装好后,您可以通过访 ...

  7. python 小题

    python 小题:给定一个字符串,找出不含有重复字符的最长子串的长度.示例 1:输入: "abcabcbb"输出: 3 解释: 无重复字符的最长子串是 "abc&quo ...

  8. 源码编译git-go

    2018.8.29 安装指定版本的git 一,安装 编译前准备: 依赖库 yum install curl-devel expat-devel gettext-devel openssl-devel ...

  9. Mui去掉滚动条:

    /////////去掉滚动条mui.plusReady(function(){plus.webview.currentWebview().setStyle({scrollIndicator:'none ...

  10. (50)LINUX应用编程和网络编程之五 Linux信号(进程间通信)

                                                                                 信号实现进程间的通信 3.5.1.什么是信号 ...