Qt程序进入等待睡眠的正确方法

移动开发
Qt程序运行的时候等待一段时间, 这段时间里可能程序什么都不做,也可能是在后台开了个子线程在做一些用户看不见的工作。当我们使用使用类似linux提供的”sleep”或”usleep”函数时很容易造成用户无法与程序交互,本文将告诉你一个正确的方法。

51CTO编者按:Qt框架是Symbian应用程序开发和MeeGo应用程序开发的主要框架,我们在编写Qt程序时经常会遇到这样的需求: 让程序等待一段时间, 这段时间里可能程序什么都不做, 也可能是在后台开了个子线程在做一些用户看不见的工作。

首先我们容易想到的方法是使用类似linux提供的”sleep”或”usleep”函数。 但用过这组函数的Qter都知道, 这组函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用sleep函数睡眠是常见的错误方案之一。

另外一种更常见的错误方法是使用QTimer+死循环。 类似下面的代码:

  1. QTimer t; 
  2. t.start(); 
  3. while(t.elapsed() < 250); 

这个简单粗暴的解决方案也是行不通的。 从代码中我们可以发现在while循环中不停的调用elapsed()函数, 等于在这段时间内CPU完全没有机会做别的什么事情。 特别是在Linux这样非抢占式的操作系统中, 这样的死循环造成的影响是致命的, CPU被完全占用, 内核都没有机会调度进程, 别的程序拿不到时间片执行, 系统基本上就是瘫痪状态了。 无论如何, 这种结果都不是我们想要的。(当然拉, 除非你想写的是病毒程序。) 对于我们的程序本身, 虽然它占用了所有的CPU, 但由于它陷入该循环, 程序没有机会进入到GUI事件循环, 导致同样界面是无法刷新的。

其实把上面的代码稍加改变就能得到一个很好的解决方案。 第一步, 解决界面无法刷新的问题。 调用QCoreApplication::processEvents(), 代码如下:

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

第二步, 解决程序CPU占用率过高的问题 -- 让程序适当睡眠。

  1. QTimer t; 
  2. t.start(); 
  3. while(t.elapsed() < 250
  4. QCoreApplication::processEvents(); 
  5. usleep(10000);//sleep和usleep都已经obsolete,建议使用nanosleep代替 

这里设置程序睡眠一段很短很短的时间, 对于用户来说是不会有什么感觉的, 但对内核来说就意义大不同。 这样内核就有充足的时间调度进程/线程, 让其他程序有机会执行。

在Qt里其实是提供了类似的API的, 只是不在core或gui库里, 而是在QTestLib中。 参考下面的文档:http://doc.qt.nokia.com/4.6/qtest.html#qWait

这个函数是专为Qt测试提供, 所以不建议直接使用在Qt程序中。 不过它的基本实现差不多就是我们上面列出的代码, 很简单, copy paste到程序里用就好了。

Phone Club——51CTO移动开发线下技术沙龙

活动日期:1月15日
本期主题:Android应用开发技术进阶
地点:北京市海淀区中关村南大街30号东联艺术工社
演讲讲师:范怀宇(网易)

【编辑推荐】

  1. QTreeWidget设计解决没有拖动项问题
  2. Symbian和MeeGo将统一开发环境 Qt压力很大
  3. QtCreator:MeeGo开发程序入门手册
  4. 诺基亚发布Qt 4.6版本 支持多点触摸和手势输入
  5. 在QT SDK下构建MeeGo Touch开发环境

 

责任编辑:佚名 来源: cuteqt
相关推荐

2010-08-06 13:20:00

DB2锁等待

2011-09-08 15:29:29

Windows7睡眠模式

2010-09-02 16:40:15

SQL删除

2021-10-25 22:26:31

Windows 11Windows微软

2010-08-02 17:30:30

DB2锁等待

2021-11-18 22:41:27

Windows 10Windows微软

2010-03-05 16:51:01

Python程序转为E

2010-09-29 15:20:29

2010-02-26 08:59:10

WCF服务宿主程序

2010-05-04 10:39:28

Oracle MTS

2013-06-08 14:38:03

移动移动互联网Qt

2020-02-04 14:25:29

云迁移云计算云平台

2009-12-07 18:57:17

PHP读取Cookie

2020-07-23 11:23:51

存储备份数据

2010-08-04 17:10:37

DB2数据库

2014-04-18 10:18:15

2010-05-21 12:35:03

IIS Lockdow

2011-06-29 16:50:17

Qt 显示宽字符

2010-06-17 10:41:24

开机进入Grub

2010-07-22 14:31:13

Microsoft S
点赞
收藏

51CTO技术栈公众号