C++ 睡眠函数

2023-12-11

我正在尝试执行一个有点准确的睡眠功能。我测量了我的睡眠功能睡了多长时间,并将它们并排放置。下面示例的格式为:“预期毫秒:结果毫秒”。

我尝试了很多选择,但仍然找不到解决方案。以下是我尝试过的路线:

Route 1

Sleep(<time>)
/* milliseconds */
38.4344 46.4354
41.728 47.7818
0.556 0.0012
43.6532 46.8087
0.4523 0.0009
62.8664 76.995
1.5363 15.4592
75.9435 78.1663
91.5194 92.0786
0.6533 0.001
39.7423 45.6729
0.5022 0.0008
54.7837 60.597
0.4248 0.0011
39.2165 45.6977
0.4854 0.0008
10.6741 15.054
  • 几乎没有明显的 CPU 使用率,这很好,但结果仍然不准确。

Route 2

/* Windows sleep in 100ns units */
BOOLEAN nanosleep(LONGLONG ns){
    /* Declarations */
    HANDLE timer;   /* Timer handle */
    LARGE_INTEGER li;   /* Time defintion */
    /* Create timer */
    if(!(timer = CreateWaitableTimer(NULL, TRUE, NULL)))
        return FALSE;
    /* Set timer properties */
    li.QuadPart = -ns;
    if(!SetWaitableTimer(timer, &li, 0, NULL, NULL, FALSE)){
        CloseHandle(timer);
        return FALSE;
    }
    /* Start & wait for timer */
    WaitForSingleObject(timer, INFINITE);
    /* Clean resources */
    CloseHandle(timer);
    /* Slept without problems */
    return TRUE;
}
/* milliseconds */
1.057 14.7561
66.5977 79.4437
0.409 14.7597
152.053 156.757
1.26725 15.747
19.025 30.6343
67.3235 78.678
0.4203 14.4713
65.3507 74.4703
0.4525 14.8102
28.6145 29.7099
72.0035 74.7315
0.5971 14.8625
55.7059 59.3889
0.4791 14.5419
50.9913 61.6719
0.5929 15.5558
  • CPU 使用率较低,这很好,但仍然不准确。
  • 我曾在某处读到,使用多媒体计时器可以提供准确的睡眠。

代码来源

Route 3

void super_sleep(double ms)
{
    auto a = std::chrono::steady_clock::now();
    while ((std::chrono::steady_clock::now() - a) < std::chrono::milliseconds(static_cast<int>(ms))) {
        continue;
    }
}
/* milliseconds */
55.7059 55.0006
0.5669 0.0008
66.5977 66.0009
0.4213 0.0009
0.7228 0.0007
7.5374 7.0006
0.8825 0.0007
0.4143 0.0009
59.8062 59.0005
51.7157 51.0006
54.0807 54.0006
11.8834 11.0006
65.3507 65.0004
14.429 14.0006
0.4452 0.0012
1.6797 1.0004
96.0012 96.0006
  • 比其他尝试效果好很多,但占用了我高达 7% 的 CPU。

我也尝试过使用std::this_thread::sleep_for()并获得与路线 2 类似的结果。

我使用的是 Windows 10 20H2、C++17 和 i9 9900k。


一种获取方式pretty良好的准确性(但并不完美,因为 Windows 不是实时操作系统),是使用标准睡眠功能之一,但睡眠时间短 - 然后忙等待剩余时间。这通常会保持较低的 CPU 使用率。

template<class T, class U>
void Sleep(std::chrono::duration<T,U> ss) {
    auto target = std::chrono::steady_clock::now() + ss; // the target end time

    // Sleep short. 5 ms is just an example. You need to trim that parameter.
    std::this_thread::sleep_until(target - std::chrono::milliseconds(5));

    // busy-wait the remaining time
    while(std::chrono::steady_clock::now() < target) {}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 睡眠函数 的相关文章

随机推荐

  • 为什么我的多维数组初始化不起作用?

    出于某种原因 在 IntelliJ 中 如果这很重要 当我尝试初始化 2D 数组时 只有第一个框会根据我指定的大小进行初始化 IE int grid new int 9 9 当我运行调试器时 它显示我已经创建了一个数组int 9 有谁知道我
  • 如何将数据从 iCloud 存储文件迁移到本地存储中的新存储文件?

    I have iCloud在我的应用程序中 我已经删除了iCloud从我的应用程序 但在 ios 6 应用程序崩溃 我收到此消息 NSPersistentStoreCoordinator addPersistentStoreWithType
  • 将 app.config 与类库一起使用

    我经常需要创建一个 Net 类库 它需要 app config 来存储数据库连接字符串等内容 但是 这些设置必须位于调用应用程序的 app config 或 web config 中 如果我想跨多个应用程序分发 DLL 这会变得很痛苦 因为
  • 将多行环境变量拆分为几行

    我有以下问题 我在 Jenkins 服务器上执行 Windows 批处理文件 并且必须将多行环境变量 通过 Jenkins 参数设置 拆分为单行 每一行都是另一个程序的参数列表的一部分 Jenkins 文本框参数 foo 224 bar S
  • xtable 的颜色代码单元格

    我用过 R sweave 但是notknit 和 xtable 创建一个表 其中 1 列是标识符 其他三列是 标志 列 它们要么为空 要么包含 1 标志 我希望能够对最后三列进行着色 以便每个单元格要么是绿色 如果为空白 要么是红色 如果包
  • 无法使用 Vitamio 进行直播

    我正在尝试使用Vitamio要运行 RTSP 视频流 我在更新 Vitamio sample 后使用它来运行流VideoViewDemo活动 public class VideoViewDemo extends Activity TODO
  • Hadoop 流命令失败并出现 Python 错误

    我是 Ubuntu Hadoop 和 DFS 的新手 但我已经按照 Michael Noll com 上发布的说明成功在本地 ubuntu 计算机上安装了单节点 hadoop 实例 http www michael noll com tut
  • Html.Hidden 字段未设置

    我的视图中有一个隐藏字段 如下所示 using Html BeginForm Action Schedule Html Hidden Id Model Schedule Id 以及一个接受如下信息的操作方法 public ActionRes
  • 如何在C中读取或捕获Ctrl+某个键或Alt+某个键?

    For example I want to do some thing when some combination of Ctrl key with any other key is pressed or it may be Alt key
  • 忽略 TextField SwiftUI 组合中输入中的左侧空格

    我正在传递给 TextField 发布的变量 TextField First name text state firstName 我想控制估算 如果从左侧输入 则忽略空格 我可以在哪里以及如何做 可以使用代理绑定来完成 如下所示 TextF
  • 在 Mercurial 中指定编辑器

    一般来说 如果我有一个 W 类型的自定义文件 并且想要使用自定义应用程序 编辑器 X 打开 查看它 当我想要编辑 查看该文件时 如何设置 Hg 来调用应用程序 X 具体示例 我使用 TortoiseHg 来跟踪一组文件 这些文件是由自定义应
  • 可以观察到分组和去抖动吗?

    我有一个可观察的对象 它发出一个包含一些参数的对象 在对象中 参数之一 称为optionId 明确标识一个选项 我想消除该发射的所有实例 然而 如果一个新的optionId出现 我想启动一个新的时钟 并开始一个新的反跳 这是我正在寻找的示例
  • 如何在 Swift 中创建自定义 getter 方法?

    我正在尝试使用以下代码为我的属性创建自定义设置方法 var myProperty String get if CONDITION1 return CONDITION1 STRING else if CONDITION2 return CON
  • “adb install”返回错误:协议错误(无状态)

    我已经创建并运行了几个 Android 模拟器 现在我想在它们上安装应用程序 这是我多次尝试的故事 adb s emulator 5562 install xxx apk daemon not running starting it now
  • 标题大写

    我正在尝试编写一种将标题大写的方法 它不应将每个单词都大写 而应仅将大单词大写 如果您愿意的话 有时 它必须将每个单词大写 也许我需要为这些小词添加一个例外 这是 Ruby 教程的一部分 我无法使用 Railstitleize方法 这是我到
  • R - 使用 par() 创建 ggplot 绘图网格 - 未按预期工作[重复]

    这个问题在这里已经有答案了 我有一些数据看起来像这样 Generate example data exampleData lt data frame Month sample 1 5 500 replace T Product sample
  • WPF 和 NotifyPropertyChanged 来自不同的线程

    我对 WPF 非常有经验 但有一件事困扰着我 我正在使用 ReactiveUI 引发 INotifyPropertyChanged 事件 我有两个类似的地方 public UiModel UiModel get return uiModel
  • 使用 Odeint 求解复矩阵微分方程

    我想求解矩阵微分方程 像这个 import numpy as np from scipy integrate import odeint def deriv A t Ab return np dot Ab A Ab np array 0 2
  • 使用c#读取Word文档

    我需要从一个特定的点开始阅读word文档 该关键字取自下拉组合框 关键字类似于 blah blah blah 001 所以 我只需要阅读从该关键字到下一个标题的内容 我用它来逐行读取标题编号 但标题编号不起作用 string headNum
  • C++ 睡眠函数

    我正在尝试执行一个有点准确的睡眠功能 我测量了我的睡眠功能睡了多长时间 并将它们并排放置 下面示例的格式为 预期毫秒 结果毫秒 我尝试了很多选择 但仍然找不到解决方案 以下是我尝试过的路线 Route 1 Sleep