C++实现精确延时的多种方法与性能对比
目录
- 1. 标准库方法
- 2. Windows平台专用方法
- 3. linux平台专用方法
- 4. 忙等待实现 (最高精度但最耗CPU)
- 5. Qt框架实现
- 精度比较表
- 使用建议
- 示例:精确500ms延时循环
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 &编程客栈gt;= 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> + http://www.devze.comsleep | 1编程-5ms | 低 | 是 | 推荐通用方案 |
Windows API | <1ms | 中 | 否 | Windows最佳方案 |
nanosleep | <1ms | 低 | Linux/Unix | Linux最佳方案 |
忙等待 | <0python.1ms | 100% | 是 | 仅用于极短延时 |
Qt实现 | 1-5ms | 低 | 是 | Qt项目适用 |
使用建议
通用场景:使用C++11&nbs编程p;<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++延时内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论