让Qt程序等待/睡眠的正确方法
来源:互联网 发布:golang 1.7 编辑:程序博客网 时间:2024/09/21 08:50
我们在编写Qt程序时经常会遇到这样的需求: 让程序等待一段时间, 这段时间里可能程序什么都不做, 也可能是在后台开了个子线程在做一些用户看不见的工作。 另外一种更常见的错误方法是使用QTimer+死循环。 类似下面的代码: 这个简单粗暴的解决方案也是行不通的。 从代码中我们可以发现在while循环中不停的调用elapsed()函数, 等于在这段时间内CPU完全没有机会做别的什么事情。 特别是在Linux这样非抢占式的操作系统中, 这样的死循环造成的影响是致命的, CPU被完全占用, 内核都没有机会调度进程, 别的程序拿不到时间片执行, 系统基本上就是瘫痪状态了。 无论如何, 这种结果都不是我们想要的。(当然拉, 除非你想写的是病毒程序。) 对于我们的程序本身, 虽然它占用了所有的CPU, 但由于它陷入该循环, 程序没有机会进入到GUI事件循环, 导致同样界面是无法刷新的。 其实把上面的代码稍加改变就能得到一个很好的解决方案。 第一步, 解决界面无法刷新的问题。 调用QCoreApplication::processEvents(), 代码如下: 第二步, 解决程序CPU占用率过高的问题 -- 让程序适当睡眠。 这里设置程序睡眠一段很短很短的时间, 对于用户来说是不会有什么感觉的, 但对内核来说就意义大不同。 这样内核就有充足的时间调度进程/线程, 让其他程序有机会执行。 在Qt里其实是提供了类似的API的, 只是不在core或gui库里, 而是在QTestLib中。 参考下面的文档: http://doc.qt.nokia.com/4.6/qtest.html#qWait 这个函数是专为Qt测试提供, 所以不建议直接使用在Qt程序中。 不过它的基本实现差不多就是我们上面列出的代码, 很简单, copy paste到程序里用就好了。 原文链接:http://www.cuteqt.com/blog/?p=1984
首先我们容易想到的方法是使用类似linux提供的”sleep”或”usleep”函数。 但用过这组函数的Qter都知道, 这组函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用sleep函数睡眠是常见的错误方案之一。
QTimer t;
t.start();
while(t.elapsed() < 250);
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
}
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
usleep(10000);//sleep和usleep都已经obsolete,建议使用nanosleep代替
}
- 让Qt程序等待/睡眠的正确方法
- Qt程序等待/睡眠的正确方法
- Qt程序等待/睡眠的正确方法
- Qt程序进入等待睡眠的正确方法
- Qt程序进入等待睡眠的正确方法
- Qt程序进入等待睡眠的正确方法
- Qt程序进入等待睡眠的正确方法
- Qt 如何正确的让程序睡眠
- 如何让Qt 的程序等待一段时间
- 如何让Qt 的程序等待一段时间
- qt 如何让程序等待
- 如何让 Qt 的程序正确使用 Sleep .
- Qt实现睡眠的几种方法
- 线程中各种唤醒、等待、睡眠方法之间的区别
- STM32--程序睡眠唤醒下载的方法
- 让电脑快速改变睡眠方式的小程序
- 正确的休息和睡眠
- 让windows睡眠或休眠的3种方法
- 文件重定向至脚本 tty命令妙用
- 判断哪个单选按钮被选中
- databasestyle
- 要毕业了!
- ++运算符的重载前置与后置
- 让Qt程序等待/睡眠的正确方法
- 标点符号和特殊符号的英文表示
- android busybox 配置
- [转]javascript面向对象之我解
- 高级编程能力
- 研发团队问卷调查
- V8和JavaScriptCore在Android Froyo上的速度比较
- QT meeGo 中文字符串排序
- vb做的贪吃蛇