关于在Qt里让程序休眠一段时间的方法总结

简介:

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);

这种死循环也是一种常见错误用法。但改成正确的还是比较简单的:

  1. QTime t;  
  2. t.start();  
  3. while(t.elapsed()<1000)  
  4. QCoreApplication::processEvents();  

不停地处理事件,以使得程序保持响应。

QElapsedTimer

这是Qt4.7引入的新的类,和QTime相比,它提供了更快的计算 elapsed 时间的方法。

  1. QElapsedTimer t;  
  2. t.start();  
  3. while(t.elapsed()<1000)  
  4. 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模块,所以在程序中我们不要使用它。

QEventLoop

配合QTimer使用局部的 eventLoop 也是一个不错的选择。例子:

  1. QEventLoop eventloop;  
  2. QTimer::singleShot(100, &eventloop, SLOT(quit()));  
  3. 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

作者: 韩兆新
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:  [02]Qt语言基础
标签:  Qt杂谈

本文转自韩兆新博客博客园博客,原文链接:http://www.cnblogs.com/hanzhaoxin/archive/2012/11/23/2784887.html,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
Web App开发 存储 Linux
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
502 0
|
8月前
【QT】读写.ini配置文件的程序实现
【QT】读写.ini配置文件的程序实现
130 0
|
8月前
QT中HASH函数方法
QT中HASH函数方法
214 0
|
8月前
|
算法 Linux API
【Qt 延迟手段】Qt中实现延迟和休眠的多种方法
【Qt 延迟手段】Qt中实现延迟和休眠的多种方法
1456 0
|
8月前
|
编解码 并行计算 Java
QT界面中实现视频帧显示的多种方法及应用(二)
QT界面中实现视频帧显示的多种方法及应用
1160 0
|
6月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
537 3
|
4月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
8月前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
6月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
189 6

相关实验场景

更多