第一部分:

关于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
2011-09-22 15:48

在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 延时的更多相关文章

  1. QT 延时函数设置

    QT 的延时函数分为非阻塞延时 和 阻塞型延时 非阻塞延时: void GreenPass3::delaymsec(int msec){    QTime dieTime = QTime::curre ...

  2. Qt自定义sleep延时函数(巧妙的使用时间差,但这样似乎CPU满格,而不是沉睡)

    Qt不像VC++的win32/MFC编程那样,提供了现成的sleep函数可供调用.Qt把sleep函数封装在QThread类中.子线程可以调用sleep函数.但是如果用户想在主线程实现延时功能,该怎么 ...

  3. Qt中实现启动画面(延时过程中要加上app.processEvents())

    纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面 ,例如office软件等等. 在Qt中实现启动界面,主要就是 ...

  4. 延时程序执行Qt

    有时候为了让程序暂停一下,不让它一直跑下去,可以使它进入循环结构中! 例如: #include <QCoreApplication> #include <qdebug.h> # ...

  5. 基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统

      一:源起       1.何为CB/S的应用程序       C/S结构的应用程序,是客户端/服务端形式的应用程序,这种应用程序要在客户电脑上安装一个程序,客户使用这个程序与服务端通信,完成一定的 ...

  6. 在Qt中使用sleep(包含为win and *nix下sleep函数的实现及用法)

    http://blog.csdn.net/tingsking18/article/details/5304254 关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程 ...

  7. qt容器在并发时需要注意的地方

    最近用tbb和qt写了一个延时摄影后期控制镜头的工具,主要就是扫描目录下所有图片,按照给定参数截取图片中某区域并另存,模拟镜头摆动. 扫描后的图片路径保存在qlist内,作为只读数据,交由tbb的pa ...

  8. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

  9. 在Qt中使用sleep

      关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片.当经过指定的时间间隔后,再启动线程,继续执行代码.sleep函数并不能起到定时的作用 ...

随机推荐

  1. ios10.2真机调试包,ios升级10.2后需要添加

    下载地址: http://download.csdn.net/detail/koktear/9710820 添加地址: finder-应用程序-找到Xcode-右击显示包内容-Contents-Dev ...

  2. [LeetCode] Rising Temperature 上升温度

    Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...

  3. 查看Validate Subscription 的结果

    Sql Server Replication Monitor 提供一个feature,能够verify Replication的 Publication 和 Subscription 的数据同步sta ...

  4. 不可错过的javascript迷你库

    最近看着下自己的github star,把我吓坏了,手贱党,收藏癖的我都收藏了300+个仓库了,是时候整理一下了. Unix主张kiss,小而美被实践是最好用的,本文将介绍笔者收集的一些非常赞的开源库 ...

  5. winform打包关键部分

  6. Json.Net 使用属性定义日期的序列化格式

    如果一个实体类里所有的时间即DateTime类型的字段,都处理成统一格式的话,可以使用如下方式: IsoDateTimeConverter timeFormat = new IsoDateTimeCo ...

  7. android refbase类

    在Android的源代码中,经常会看到形如:sp<xxx>.wp<xxx>这样的类型定义,这其实是Android中的智能 指针.智能指针是C++中的一个概念,通过基于引用计数的 ...

  8. 【转载】茶叶蛋干货!《超容易的Linux系统管理入门书》(连载十)进行动态主机配置DHCP

    使用动态主机配置协议DHCP(Dynamic Host Configuration Protocol)则可以避免网络参数变化后一些繁琐的配置,客户端可以从DHCP服务端检索相关信息并完成相关网络配置, ...

  9. 拥抱ARM妹子 序章!ARM妹子~~ 哥我来啦!

    一个负心汉即将移情别恋,从51转到ARM妹子啦?其实8是的,俺准备开后宫.哇——咔~咔~~.考虑功耗和成本等问题,只有51肯定是不够的,所以嘛~~(一脸坏笑)嘿嘿~~,ARM妹子俺追定了.出于对ARM ...

  10. Xcode常见错误以及解决方案

    一.Undefined symbols for architecture x86_64: Xcode升级到5.1 新特性之一就是默认让所有App都通过64位编译器编译.原来在Xcode5.0.x的时候 ...