C++实现精确延时的多种方法与性能对比

 更新时间:2025年07月25日 09:48:44   作者:凌武贰玖  
在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项目适用

使用建议

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

Windows高精度:使用 QueryPerformanceCounter + timeBeginPeriod

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

避免忙等待:长时间延时应结合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;
        
        // 精确延时500ms
        auto 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;
}

 运行结果如下:

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

到此这篇关于C++实现精确延时的多种方法与性能对比的文章就介绍到这了,更多相关C++延时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VS Code 中搭建 Qt 开发环境方案分享

    VS Code 中搭建 Qt 开发环境方案分享

    这篇文章主要介绍了VS Code 中搭建 Qt 开发环境方案分享的相关资料,需要的朋友可以参考下
    2022-12-12
  • 基于C++语言实现机动车违章处罚管理系统

    基于C++语言实现机动车违章处罚管理系统

    这篇文章主要介绍了基于C++语言实现机动车违章处罚管理系统的相关资料,需要的朋友可以参考下
    2016-07-07
  • C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点

    C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点

    本篇文章主要介绍了C++中的普通成员函数、虚函数以及纯虚函数,非常的详细,有需要的朋友可以参考下
    2015-07-07
  • 浅析C++中的函数重载

    浅析C++中的函数重载

    这篇文章主要介绍了浅析C++中的函数重载,在C++中,可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同,或者参数类型相同而参数个数不同,又或者参数类型参数个数相同,参数次序不同,称为函数重载,需要的朋友可以参考下
    2023-08-08
  • C++选择文件夹代码的封装

    C++选择文件夹代码的封装

    这篇文章主要介绍了C++选择文件夹代码的封装,实例展示了将选择文件夹功能代码封装为一个类并对其进行实例化调用的过程,对于学习C++程序设计有不错的参考价值,需要的朋友可以参考下
    2014-10-10
  • C语言数据存储归类介绍

    C语言数据存储归类介绍

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • 详解C语言之顺序表

    详解C语言之顺序表

    这篇文章主要为大家介绍了C语言的顺序表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 基于C++17实现的手写线程池

    基于C++17实现的手写线程池

    本文主要介绍了基于C++17实现的手写线程池,自己实现了Any类,Semaphore类以及Result类的开发,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • C语言 数据结构之数组模拟实现顺序表流程详解

    C语言 数据结构之数组模拟实现顺序表流程详解

    顺序表,全名顺序存储结构,是线性表的一种,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外,不仅如此,顺序表对数据的物理存储结构也有要求,跟随下文来具体了解吧
    2021-11-11
  • C++类和对象之类的6个默认成员函数详解

    C++类和对象之类的6个默认成员函数详解

    类是对某一事物的抽象描述,具体地讲类是C++中的一种构造的数据类型,下面这篇文章主要给大家介绍了关于C++类和对象之类的6个默认成员函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论