Qt 延时
第一部分:
关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。sleep函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素,所以说sleep函数是不能用来精确计时的。 Qt为我们提供了几个可以用于线程Sleep的函数,分别是: void QThread::sleep ( unsigned long secs ) [static protected] void QThread::msleep ( unsigned long msecs ) [static protected] void QThread::usleep ( unsigned long usecs ) [static protected] sleep的单位分别是秒、毫秒、微秒。 但是现在问题出来了,请仔细看上面的函数定义,函数的访问权限都是protected,这就意味着,我们必须在QThread或者他的继承类中使用这三个函数。 但是我们可能需要在非继承QThread的类中来使用sleep函数。那这该这么办呢?下面我就给大家提供几种解决方法。 1. processEvents QTime dieTime = QTime::currentTime().addMSecs(svalue); while( QTime::currentTime() < dieTime ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 调用processEvents会让Qt继续处理线程所在的消息队列中未处理的消息,直到消息队列中没有消息可以处理。当进行长时间的操作的时候可以调用此函数(比方说拷贝文件)。这个函数可能和我们要使用msleep的本意有差别,但是使用它可以在svalue时间内处理events,从而达到类似sleep的目的。 2. QWaitCondition QWaitCondition wait; wait.wait(time); wait的单位是milliseconds,但是wait和sleep的作用是不同的。 sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非 (a)“醒来”的线程具有更高的优先级。 (b)正在运行的线程因为其它原因而阻塞。 wait()会使调用它的线程暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 3. 查看sleep的源代码,使用Qt在win下和*nix下的sleep函数。 Windows下的sleep的代码为: void QThread::sleep(unsigned long secs) { ::Sleep(secs * 1000); } sleep的单位为秒。 *nix下sleep的代码为: void QThread::sleep(unsigned long secs) { struct timeval tv; gettimeofday(&tv, 0); struct timespec ti; ti.tv_sec = tv.tv_sec + secs; ti.tv_nsec = (tv.tv_usec * 1000); thread_sleep(&ti); } static void thread_sleep(struct timespec *ti) { pthread_mutex_t mtx; pthread_cond_t cnd; pthread_mutex_init(&mtx, 0); pthread_cond_init(&cnd, 0); pthread_mutex_lock(&mtx); (void) pthread_cond_timedwait(&cnd, &mtx, ti); pthread_mutex_unlock(&mtx); pthread_cond_destroy(&cnd); pthread_mutex_destroy(&mtx); } 我们可以对这两个函数进行简单的封装,从而达到真正的sleep的作用。 版权声明
本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。http://jinsuo2007.blog.163.com/blog/static/192279952011875724406/
Qt4——程序延时的方法 http://blog.csdn.net/sunnyskyliu/article/details/6721277
1: void QTimer::singleShot ( int msec, QObject * receiver, const char* member ) [static]
样例: #include<QApplication> #include<QTimer> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTimer::singleShot(600000,&app, SLOT(quit())); ... return app.exec(); }
2:以毫秒计
QTimen=QTime::currentTime(); QTimenow; do{ qDebug()<<"jjmm"; now=QTime::currentTime(); } while(n.msecsTo(now)<=1);
3:以秒计
QDateTime n2=QDateTime::currentDateTime(); QDateTime now; do{ now=QDateTime::currentDateTime(); } while(n2.secsTo(now)<=6);//6为需要延时的秒数
第二部分:
来
在qt中不能直接使用sleep()函数,经查看可以发现,sleep在QThread中定义的有,但他是private模式,外部函数无法调用。利用一下方法可以实现sleep效果。我用的是第一种方法。 方法一: class SleeperThread : public QThread { public: static void msleep(unsigned long msecs) { QThread::msleep(msecs); } }; // 调用方法 SleeperThread::msleep(1000); 方法二: QMutex mutex; QWaitCondition sleep; mutex.lock(); sleep.wait(&mutex, 1000); mutex.unlock(); 来自:http://hi.baidu.com/%CE%D2%B6%A5%D0%ED%CE%A1/blog/item/bc0e5fd9d62af0c28c1029c3.html 第三部分:
sleep()//秒 msleep()//毫秒 usleep()//微秒 以前为了模拟鼠标点击用过这些函数,可以让进程中断,今天发现我原来的做法其实不对. 这组函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用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,Linux下也可以使用nanosleep代替 } 以后要用,就可以直接用上面的代码了,用usleep()就可以了,那个nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用 schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。 |
Qt 延时的更多相关文章
- QT 延时函数设置
QT 的延时函数分为非阻塞延时 和 阻塞型延时 非阻塞延时: void GreenPass3::delaymsec(int msec){ QTime dieTime = QTime::curre ...
- QT延时方法
(转自:http://blog.sina.com.cn/s/blog_613cfe940100kacm.html) 1. void sleep(unsigned int msec){ QTime ...
- Qt 延时处理的几种办法
有些时候,我们需要程序延时一会儿: 这里提供四种方法: 1.多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread:: ...
- QT延时方法整理(QTimer::singleShot,QWaitCondition,QDateTime.secsTo三种新方法)
1: void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [static] 样例: #inclu ...
- Qt自定义sleep延时函数(巧妙的使用时间差,但这样似乎CPU满格,而不是沉睡)
Qt不像VC++的win32/MFC编程那样,提供了现成的sleep函数可供调用.Qt把sleep函数封装在QThread类中.子线程可以调用sleep函数.但是如果用户想在主线程实现延时功能,该怎么 ...
- Qt应用开发常见问题
Qt判断当前操作系统? 可使用宏判断,例如: #ifdef Q_OS_MAC //mac ... #endif #ifdef Q_OS_LINUX //linux ... #endif #ifdef ...
- Qt应用开发所需
Qt判断当前操作系统? 可使用宏判断,例如: #ifdef Q_OS_MAC //mac ... #endif #ifdef Q_OS_LINUX //linux ... #endif #ifdef ...
- Qt中实现启动画面(延时过程中要加上app.processEvents())
纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面 ,例如office软件等等. 在Qt中实现启动界面,主要就是 ...
- 延时程序执行Qt
有时候为了让程序暂停一下,不让它一直跑下去,可以使它进入循环结构中! 例如: #include <QCoreApplication> #include <qdebug.h> # ...
随机推荐
- flask-admin
初始化 class Admin(app=None, name=None, url=None, subdomain=None, index_view=None, translations_path=No ...
- 织梦DedeCMS列表摘要 description 长度控制方法
[field:description /]标签如何限制字数? [field:description function='cn_substr(@me,80)'/] DedeCMS 里的所有标记都支持这样 ...
- 织梦dedecms简略标题调用标签用法指南
我们在使用织梦DEDECMS建站过程中,为了使调用的文章标题简短且相对完整(原文标题太长),只好使用了调用简略标题这个方法,使标题显示为简短标题,指向标题时显示完整的标题.并获得文章静态地址链接 下面 ...
- CentOS 5.5 下安装Countly Web Server过程记录
CentOS 5.5 下安装Countly Web Server过程记录 1. 系统更新与中文语言包安装 2. 基本环境配置: 2.1. NodeJS安装 依赖项安装 yum -y install g ...
- JavaScript高级 面向对象的程序设计 (二)《JavaScript高级程序设计(第三版)》
二.继承 OO是面向对象语言最为有魅力的概念.一般的OO语言都实现了两种继承,接口继承和实现继承.接口继承只继承方法签名,而实际继承继承了实际的方法. 而在JS中,函数没有签名,所以无法实现接口继承. ...
- asp.net webuploader粘贴,拖拽,点击上传图片
demo.html代码:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...
- C#局域网桌面共享软件制作(三)
到周末了,继续做这个桌面共享软件,下面是前两篇的链接, 链接 C#局域网桌面共享软件制作(一) 链接 C#局域网桌面共享软件制作(二) 通过对图片进行压缩以后,每张图片大小38K左右(win7/102 ...
- Win 2003下IIS6+Mysql+php5.2 isapi搭建 升级php5.2到5.3测试 借助fastcgi实现
Win 2003下IIS6+Mysql+php5.2 原环境isapi搭建 升级php5.2到5.3测试 借助fastcgi实现 操作如下 实验前准备:php-5.3.5-Win32-VC6-x86 ...
- 解决:JS如何取得当前正在执行的function的名字
代码如下 function getFName(fn){ return (/^[\s\(]*function(?:\s+([\w$_][\w\d$_]*))?\(/).exec(fn.toString( ...
- 两种会话状态之Session会话
什么是Session 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度. Session技 ...