我们在编写Qt程序时经常会遇到这样的需求: 让程序等待一段时间, 这段时间里可能程序什么都不做, 也可能是在后台开了个子线程在做一些用户看不见的工作。
首先我们容易想到的方法是使用类似linux提供的”sleep”或”usleep”函数。 但用过这组函数的Qter都知道, 这组函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用sleep函数睡眠是常见的错误方案之一。
另外一种更常见的错误方法是使用QTimer+死循环。 类似下面的代码:
QTimer t;
t.start();
while(t.elapsed() < 250);
这个简单粗暴的解决方案也是行不通的。 从代码中我们可以发现在while循环中不停的调用elapsed()函数, 等于在这段时间内CPU完全没有机会做别的什么事情。 特别是在Linux这样非抢占式的操作系统中, 这样的死循环造成的影响是致命的, CPU被完全占用, 内核都没有机会调度进程, 别的程序拿不到时间片执行, 系统基本上就是瘫痪状态了。 无论如何, 这种结果都不是我们想要的。(当然拉, 除非你想写的是病毒程序。) 对于我们的程序本身, 虽然它占用了所有的CPU, 但由于它陷入该循环, 程序没有机会进入到GUI事件循环, 导致同样界面是无法刷新的。
其实把上面的代码稍加改变就能得到一个很好的解决方案。 第一步, 解决界面无法刷新的问题。 调用QCoreApplication::processEvents(), 代码如下:
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
}
第二步, 解决程序CPU占用率过高的问题 -- 让程序适当睡眠。
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
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到程序里用就好了。
转载声明: 本文转自
http://wangjiajun53880.blog.163.com/blog/static/1170013942011031115235405/
分享到:
相关推荐
从Qt官网上下载的Qt的解决方案资料库(Qt Solutions Archive) http://qt.nokia.com/products/qt-addons/solutions-archive/ 有JPEG2000的,有Windows中Services的,有浏览器插件的,有单应用程序的,有SOAP的,有...
支持QT的PC/SC智能卡测试程序源码,包括连接读卡器、枚举读卡器、连接卡片、发送APDU命令等操作
Qt6 QML Book/Qt for Python/构建应用程序 示例源码 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者交流使用,请于下载24小时内删除
qt采用C++/CLI 方式调用C#dll的Demo. 网上c#调c++的一大堆,但是反过来的却寥寥无几。有的也很简单,实际应用中,不仅需要导出类,还...// 即:QT可执行程序->CSharpExportWrapper动态库(CLR)->CSharpScriptExport
写了点Qt界面程序,然而发现很难移植到其他没有安装Qt环境的电脑上运行。查资料了解到,在windows上有windowsdeployqt程序,linux上有linuxdeployqt可以帮助我们快速打包。 1. 配置Qt环境 首先,我们先把Qt环境配置...
Qt6 QML Book/Qt C++/样板应用程序 示例源码 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者交流使用,请于下载24小时内删除
基于QT的TCP/IP聊天小程序,代码简洁,功能全面,里面有源代码和运行发布的EXE,有主界面,客户端界面和服务器界面,可以作为聊天小程序
export set TMAKEDIR=/dishes/qt/tmake export set TMAKEDIR=/dishes/qt/tmakeexport set TMAKEDIR=/dishes/qt/tmakeexport set TMAKEDIR=/dishes/qt/tmakeexport set TMAKEDIR=/dishes/qt/tmakeexport set TMAKEDIR...
简单的QT模拟TCP/HTTP服务端的的Demo程序,可以用来和客户端交互简单数据,Linux和windows上都可以用,主要为了博客连接
支持好友和黑名单列表,已经添加删除查找。支持发送离线消息。支持用户在线和离线状态。支持文件传输和类似qq截屏等功能。
QT5.4以后就取消了webkit,采用QWebEngineView来实现加载html网页,该程序实现了简单的加载html页面,同时还实现了qt调用js,js调用qt的对象和方法。该程序采用QT5.9.1开发
1. Qt嵌入子Qt程序窗口到当前程序 2. 两程序都是Qt Widgets项目 3. 项目IDE为VS+Qt
已编译的适用于linux环境qt程序无法使用sogou输入法等基于fcitx的输入法的动态链接库,libfcitxplatforminputcontextplugin.so (x86_...[PATH]/SystemFiles/Libraries/Linux-x86-64/Qt/plugins/platforminputcontexts
1.波浪线的绘制:sin和cos;涉及到的数学知识:简谐运动 2.在paintEvent中进行图形图像的绘制,大量使用QPainterPath类;进行图像的相加、相减操作;
git clone ssh://codereview.qt-project.org:29418/qt/qt5.git cd qt5 ./init-repository --codereview-username <username> \ --module-subset=qtbase,qtsvg,qtdeclarative,qttools,qtxmlpatterns,qtdoc,qlalr,...
主要简单讲诉 QT View/Model 和 delegate 完整工程代码
本资源包含x86 linux下qt程序解决同时只允许运行一个程序实例的库,头文件和使用方法!
用Qt开发的文件及文件夹得压缩以及解压功能,zip,unzip
QT程序如何在开发板上运行