来自 http://www.qtgtk.com/qt延时-qt中简单的延时办法/

QEventLoop eventloop;

QTimer::singleShot(time, &eventloop, SLOT(quit()));
eventloop.exec();

其中time代表延时时长。若QEventLoop是跨平台的,则该延时办法可跨平台实现。

void sleep(unsigned int msec)

{

QTime dieTime = QTime::currentTime().addMSecs(msec);

while( QTime::currentTime() < dieTime )

QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

}

关于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的作用。

另一种方法,不过没试过:

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();

同时可以

void myThread::run(int time)
{
usleep(time);
QMessageBox::information(0, “test “, “ok,test is successful! “);
}

转载自:
http://hi.baidu.com/potyzhang/item/cdc5e1bb572bc275254b09bf

qt延时 QT中简单的延时办法相关推荐

  1. QT 中怎样实现延时 stop

    Qt中怎样实现延时 halcon算子翻译--stop 在非继承QThread的类中来使用sleep函数.下面是解决方法: QTime dieTime = QTime::currentTime().ad ...

  2. linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...

    嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...

  3. QT:在QT中调用摄像头并实现简单的拍照功能

    要在QT中使用摄像头,就要链接多媒体模块以及多媒体工具模块: QT += multimedia QT += multimediawidgets 废话少说,直接上代码,想说的都在代码里面斜体样式: ma ...

  4. 嵌入式成长轨迹34 【嵌入式学习阶段】【ARM环境调试】【QT 移植环境及简单程序示例】---补充《ok6410 Qt移植百科全书》...

    更新版 http://www.cnblogs.com/zeedmood/archive/2012/12/08/2808393.html 书上提及的有这些,分别说明下,里边打*可以不弄:   Tslib ...

  5. 现代c++中实现精确延时方法总结

    程序中实现延时有很多种办法,但是有些不建议用.比如还在用sleep()或者空转计数的方式延时?要么移植性不好,要么不够精确且效率太低.这里总结下现代c++中推荐的一种实现精确延时的方法. 之前的一些用 ...

  6. [野火]一种Cortex-M内核中的精确延时方法-ns级别-DWT

    看书 对书里面内容写文字 原创: 杰杰 物联网IoT开发 2018-11-10 https://mp.weixin.qq.com/s/1ruKZ2uJFaWqQn-tnGQp6A 前言 为什么要学习这 ...

  7. 一种Cortex-M内核中的精确延时方法

    本文介绍一种Cortex-M内核中的精确延时方法 前言 为什么要学习这种延时的方法? 很多时候我们跑操作系统,就一般会占用一个硬件定时器--SysTick,而我们一般操作系统的时钟节拍一般是设置100 ...

  8. 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)

    拼多多现在也是越来越火了,但是不知道大家有没有发现,拼多多似乎一直不能通过网页进行访问.淘宝,京东都有微信客户端,那么怎么拼多多就没有呢?带着这个疑问,我特地去手机爬取了一下拼多多的客户端.(其实也不 ...

  9. 4、Qt设备识别(简单的密钥生成器)

    一.介绍 在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制.         1.远程联网激活,每次启动都联网查看使用 ...

最新文章

  1. java主动抛出400异常_400个线程同时查询数据,抛出一个异常
  2. dotnet core高吞吐Http api服务组件FastHttpApi
  3. python导入其他py文件-Python如何import其它.py文件及其函数
  4. JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
  5. 混合文件下分离xml文件和jpg文件
  6. 噪声的频谱分析的重要意义_噪声测量:噪声源识别与定位的方法简析
  7. 米斯特白帽培训讲义(v2)漏洞篇 Web 中间件
  8. 服务器系统时间提前八小时,windows服务器时间少八小时
  9. idea集成svn问题
  10. pimple idiom C++
  11. 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码解析 道翰天琼认知智能api机器人接口。
  12. 计算机二级office知识框架,计算机二级Office:Excel模拟分析和图表知识点讲解
  13. 代码行统计工具:根据命令行输入的指定目录及文件类型进行统计目录或单个文件的代码行数
  14. pycharm中import导入包呈现灰色问题
  15. 深度学习PyTorch笔记(9):自动求导
  16. Zhong__Centos8安装docker
  17. 罗克韦尔Rockwell Automation EDI 项目
  18. 计算1+3+5+....+99的和
  19. Android 软键盘 弹出,默认隐藏,强制隐藏,自动变大写等
  20. POJ 2245 Addition Chains(算竞进阶习题)

热门文章

  1. 百度语音识别开放平台SDK用法
  2. java设计模式之原型模式和建造者模式的写法(二)
  3. 无法将“pytest”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  4. 匹马行天下之逆风翻盘篇——塞翁失马焉知非福
  5. 【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码
  6. ubuntu10安装cuda和cudnn
  7. WideDeep论文翻译
  8. 工行接口对接(开户H5、SFTP文件对帐、e支付H5、e支付回调等)
  9. 编解码再进化:Ali266 与下一代视频技术
  10. py217-基于Python+django的服装销售商城网站#毕业设计