当前位置: 首页 > news >正文

C++实现精确延时的方法

在C++中实现精确延时有多种方法,以下是几种常见的实现方式,适用于不同场景和精度要求:

1. 标准库方法

<chrono> 高精度延时 (推荐)

#include <chrono>
#include <thread>void preciseDelay(int milliseconds) {auto start = std::chrono::high_resolution_clock::now();while (true) {auto now = std::chrono::high_resolution_clock::now();auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();if (elapsed >= milliseconds) {break;}std::this_thread::sleep_for(std::chrono::microseconds(100)); // 减少CPU占用}
}

2. Windows平台专用方法

高精度定时器 (Windows API)

#include <windows.h>void preciseDelayWin(int milliseconds) {// 提高系统定时器精度(1ms)TIMECAPS tc;timeGetDevCaps(&tc, sizeof(TIMECAPS));timeBeginPeriod(tc.wPeriodMin);LARGE_INTEGER frequency;LARGE_INTEGER start;LARGE_INTEGER end;QueryPerformanceFrequency(&frequency);QueryPerformanceCounter(&start);do {QueryPerformanceCounter(&end);} while ((end.QuadPart - start.QuadPart) * 1000 / frequency.QuadPart < milliseconds);timeEndPeriod(tc.wPeriodMin);
}

3. Linux平台专用方法

nanosleep 高精度延时

#include <time.h>void preciseDelayLinux(int milliseconds) {struct timespec ts;ts.tv_sec = milliseconds / 1000;ts.tv_nsec = (milliseconds % 1000) * 1000000;int res;do {res = nanosleep(&ts, &ts);} while (res != 0);
}

4. 忙等待实现 (最高精度但最耗CPU)

#include <chrono>void busyWaitDelay(int milliseconds) {auto start = std::chrono::high_resolution_clock::now();while (true) {auto now = std::chrono::high_resolution_clock::now();auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();if (elapsed >= milliseconds) {break;}}
}

 5. Qt框架实现 

#include <QElapsedTimer>
#include <QThread>void qtPreciseDelay(int milliseconds) {QElapsedTimer timer;timer.start();while (timer.elapsed() < milliseconds) {QThread::usleep(100); // 减少CPU占用}
}

精度比较表

方法精度CPU占用跨平台备注
<chrono> + sleep1-5ms推荐通用方案
Windows API<1msWindows最佳方案
nanosleep<1msLinux/UnixLinux最佳方案
忙等待<0.1ms100%仅用于极短延时
Qt实现1-5msQt项目适用

使用建议

  1. 通用场景:使用C++11 <chrono> 库实现,兼顾精度和可移植性

  2. Windows高精度:使用 QueryPerformanceCounter + timeBeginPeriod

  3. 实时性要求高:考虑RTOS或专用硬件定时器

  4. 避免忙等待:长时间延时应结合sleep以减少CPU占用

示例:精确500ms延时循环

#include <iostream>
#include <chrono>
#include <thread>int main() {for (int i = 0; i < 10; i++) {auto start = std::chrono::high_resolution_clock::now();// 你的任务代码std::cout << "Task " << i << " executed at " << std::chrono::system_clock::now().time_since_epoch().count() << " ns" << std::endl;// 精确延时500msauto end = std::chrono::high_resolution_clock::now();auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();if (elapsed < 500) {std::this_thread::sleep_for(std::chrono::milliseconds(500 - elapsed));}}return 0;
}

 运行结果如下:

选择哪种方法取决于你的具体需求、目标平台和精度要求。

http://www.xdnf.cn/news/1179037.html

相关文章:

  • 鸿蒙平台运行Lua脚本
  • 论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》
  • 【Word Press进阶】自定义区块的行为与样式
  • Linux(centos7)安装 docker + ollama+ deepseek-r1:7b + Open WebUI(内含一键安装脚本)
  • Terraform与Ansible的关系
  • MCNN-BiLSTM-Attention分类预测模型等!
  • 行为型模式-协作与交互机制
  • fabric搭建基础的测试网络
  • 时序数据库IoTDB的核心功能特性
  • 重构数据库未来:金仓数据库,抢占 AI 原生时代先机
  • Java 大视界 -- Java 大数据在智能教育自适应学习路径规划与学习效果强化中的应用(362)
  • [数据结构]#7 哈希表
  • 造成服务器内存不足的原因有什么
  • Lua(垃圾回收)
  • 跨境支付入门~国际支付结算(电商篇)
  • Leetcode—1035. 不相交的线【中等】
  • 深度解析:在Odoo 18中基于原生Owl框架为PWA定制功能丰富的底部导航栏
  • 磁性材料如何破解服务器电源高频损耗难题?
  • Vue2——5
  • Linux系统编程——网络
  • 【物联网】基于树莓派的物联网开发【16】——树莓派GPIO控制LED灯实验
  • 使用 eBPF 实时捕获 TCP 重传告警:精准定位网络抖动问题
  • 亚马逊云科技:引领云计算新时代,开启无限可能
  • OSPF多区域介绍
  • Android Telephony UrspRule 介绍
  • Java设计模式-适配器模式
  • Docker4-容器化企业级应用
  • 不同头会关注输入序列中不同的部分和不同维度所蕴含的信息,这里的头和嵌入维度不是对应的,仅仅是概念上的吗?
  • 调节广告adload的算法:Contextual Bandits、多臂老虎机 Policy Gradient、Q-learning
  • C++ 中打开文件的多种方式及相关流类