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

之前的一些用法

粗暴空转

long wait = 0;
while(wait  < 1000)
wait++;

这种非常不建议用,懒人做法。不够精确且换种环境系统处理速度不一样可能就是bug来源。

使用sleep()

#include <windows.h>
#include <iostream>
using namespace std;
int main()
{cout <<"a";// 先输出a,再等2秒(2000毫秒),再输出aSleep(2000);cout <<"a";return 0;
}

一般的平台或系统环境都带sleep()函数,可以实现简单的延时。但是这种延时不能指望精确,且最小精度1ms都难以保证。而且这种用法也不能跨平台,Windows下是大写字母开头的Sleep(),单位为毫秒,linux下面是小写的sleep()。Linux下的sleep()函数是以秒为单位的,sleep(1)就是休眠1秒,想实现更短的休眠,linux下有usleep()函数。

使用计时函数clock()

clock() 函数是 C 标准库 time.h 中的一个函数, time.h 标准库中定义了各种涉及日期和时间的函数, 变量类型和宏. 其中, clock() 函数可以返回自程序开始执行到当前位置为止, 处理器走过的时钟打点数(即"ticks", 可以理解为"处理器时间").

每过千分之一秒(即 1 毫秒)则 clock() 函数的返回值加 1. 但是, 处理器的时钟打点数并不是一个人类可以直观感知的时间概念, 时钟打点数只描绘了该处理器在处理该问题时所耗费的"处理器时间". 为了能将获取到的时间转换成便于人类理解且具有普遍性的"时 分 秒"的计时方式, 我们需要引入一个常量,在 Windows下使用常量 CLOCKS_PER_SEC 来进行转换且 CLOCKS_PER_SEC=1000.

在linux环境CLOCKS_PER_SEC  的值被定义成 1000000.

void delay()
{clock_t start_time;//, cur_time;start_time = clock();//clock()返回当前时间for (; (clock() - start_time) < 0.5 * CLOCKS_PER_SEC;);//延迟0.5秒
}

使用clock()函数也可以实现延时,通用性稍好些且能做到精确,但是也只能精确到1ms,常用它来测量某段代码的运行耗时用。

#include <time.h>
void test1(){clock_t start, stop;/*定义记录开始和结束时间的变量.clock_t 是 clock() 函数的返回变量类型.*/double duration;/*记录函数运行时间*/start=clock();printf("start=%d\n",start);for(int i = 0; i< 100000000; i++){;}stop=clock();printf("stop=%d\n",stop);duration=((double)(stop-start))/CLOCKS_PER_SEC;//将时钟打点数转换成人类可以直观感知的时间秒数.printf("CLOCKS_PER_SEC=%d\n",CLOCKS_PER_SEC);printf("duration=%f\n",duration);
}

使用c++11之后的线程休眠函数

C++ 11之前并未提供专门的休眠函数。c语言的sleep、usleep其实都是系统提供的函数,不同的系统函数的功能还有些差异。从C++11开始,中C++标准库提供了专门的线程休眠函数,使得你的代码可以独立于不同的平台,sleep的时间间隔从纳秒到小时都有具体的定义。

比如我们想要一个线程休眠100ms:

#include <iostream>
#include <chrono>
#include <thread>int main() {std::cout << "Hello waiter\n" << std::flush;auto start = std::chrono::high_resolution_clock::now();std::this_thread::sleep_for(std::chrono::milliseconds(2000));auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double, std::milli> elapsed = end-start;std::cout << "Waited " << elapsed.count() << " ms\n";std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

推荐的用法

千呼万唤始出来,以下才是现在c++推荐的实现精确延时的用法。

#include <chrono>void delay(int timeout_ms)
{auto start = std::chrono::system_clock::now();while (true){auto duration =std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start).count();if (duration > timeout_ms){LOGGING_ERROR("timeout occurred,timeout %d ms", timeout_ms);break;}
}

引用

C / C++ 中的计时函数: clock()_荒原之梦网的博客-CSDN博客

std::chrono::high_resolution_clock简单测试 - 知乎

C++11 新的计时方法——std::chrono 大法好_一只牛_007的博客-CSDN博客

C++11新特征8 - 时钟与计时器 - 知乎

c++11 日期和时间工具-(std::chrono::steady_clock)(std::chrono::high_resolution_clock)_繁星璀璨G的博客-CSDN博客

现代c++中实现精确延时方法总结相关推荐

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

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

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

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

  3. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  4. c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法

    实现延时通常有两种方法: 一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1 使用定时器/计数器实现精确延时 ...

  5. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法

    引言 单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一 ...

  6. 【精确延时函数】IAR(MSP430)中的精确延时函数

    在 IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下: 具体如下[引用别人的,这个延时函数很高]: 注意: __delay_cycles(x),x必 ...

  7. c语言延时函数delay_STM32中精确延时函数的实现

    在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数,下面我们以STM32F103芯片为例,详细介绍一下STM32下一种精确延时函数的实现: 时钟树 下图中紫 ...

  8. java中精确地小数_在Java等于方法中进行精确比较

    java中精确地小数 多年来,我一直在处理旧版Java代码,因此遇到了微妙的逻辑和性能问题,这些问题可以追溯到不正确覆盖的Object.equals(Object)方法. 尽管"等于&quo ...

  9. 设置session时间 php,php中实现精确设置session过期时间的方法

    这篇文章主要介绍了php中实现精确设置session过期时间的方法,需要的朋友可以参考下 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一 ...

最新文章

  1. 这道算法题太简单?你忽略了时间复杂度的要求!
  2. mysql数据库木马查杀_Linux系统木马后门查杀方法详解
  3. estimator 模型保存与使用
  4. 分布式数据库BLP安全模型介绍
  5. jQuery 倒计时插件
  6. 安装deepin后没有Windows启动项解决办法
  7. Java读取证书报错:java.io.IOException: Unknown named curve: 1.2.156.10197.1.301
  8. python调试神器snoop,让你告别print
  9. 如何下载天地图离线地图瓦片数据
  10. 8代u能装服务器系统吗,8代U安装win7,几代U支持win7
  11. 3374——数据结构实验之查找二:平衡二叉树
  12. 计算机一个远程控制用户怎么回事,电脑不能被远程控制怎么办
  13. random.RandomState()用处
  14. 什么是人工智能自动编程?它只是一个噱头吗?
  15. IEEE期刊论文格式(一)
  16. android 方向控件 MenuView 上下左右,东南西北
  17. python未读邮件_请问如何用python将某个邮箱未读邮件全部转发到另一个邮箱?
  18. 平静的纪中生活(2021.7.12~7.22)
  19. 游戏品类详解——SLG(策略类游戏)
  20. 关于VS Code中C文件调用其他C文件函数失败的解决方法

热门文章

  1. 智能媒体管理产品文档转换/预览功能介绍(1)---Cloud Native架构
  2. element-ui 表格多选框 按条件禁用部分选项
  3. iPhone手机忘记了ID账号密码怎么办
  4. 备份表(表结构和数据)
  5. Laravel 接受Ajax的POST请求
  6. 前端基础--JavaScript
  7. uniapp 侧边选项卡(左右滚动)
  8. 新版白话空间统计(9):置信度的初探
  9. CUDA C程序没报错 结果不对 找不到问题 的一种可能的问题hhhh....
  10. 2022年中国航天发射列表(全年64发)