草庐IT

c++ - 睡了一个确切的时间

coder 2023-11-16 原文

我对 Sleep 函数的理解是它遵循“至少语义”,即 sleep(5) 将保证线程休眠 5 秒,但它可能会保持阻塞超过 5 秒,具体取决于其他因素。有没有办法在指定的时间段内休眠(无需忙等待)。

最佳答案

正如其他人所说,您确实需要使用实时操作系统来尝试实现这一目标。精确的软件计时非常棘手。

然而...虽然并不完美,通过简单地提高需要更好时机的进程的优先级,您可以获得比“正常”更好的结果。在 Windows 中,您可以使用 SetPriorityClass 实现此目的功能。如果您将优先级设置为最高级别 (REALTIME_PRIORITY_CLASS: 0x00000100),您将获得好得多的计时结果。再次重申 - 不过,这不会像您要求的那样完美。

这也可能在 Windows 以外的其他平台上实现,但我从来没有理由这样做,所以没有测试过。

编辑:根据 Andy T 的评论,如果您的应用程序是多线程的,您还需要注意分配给线程的优先级。对于 Windows,这已记录在案 here .


一些背景...

前一段时间,我使用 SetPriorityClass 来提高我正在对高速视频进行实时分析的应用程序的优先级,并且我不会错过任何一帧。帧以每秒 300 帧 (fps) 的非常常规频率(由外部帧抓取器硬件驱动)到达 PC,这会在我随后处理的每一帧上触发硬件中断。由于时间非常重要,我收集了很多关于中断时间的统计数据(使用 QueryPerformanceCounter 东西)来了解情况到底有多糟糕,并对由此产生的分布感到震惊。我没有方便的统计数据,但基本上 Windows 在以正常优先级运行时只要感觉需要就可以为中断提供服务。直方图非常困惑,stdev 比我的 ~3ms 周期更宽。在中断服务中,我经常会有 200 毫秒或更长的巨大间隙(回想一下,中断大约每 3 毫秒触发一次)!!即:硬件中断远非准确!您受制于操作系统决定为您执行的操作。

但是 - 当我发现 REALTIME_PRIORITY_CLASS 设置并使用该优先级进行基准测试时,它明显更好并且服务间隔分布非常紧凑。我可以以 300 fps 的速度运行 10 分钟而不会错过任何一帧。测得的中断服务周期几乎正好是 1/300 秒,分布很紧。

另外 - 尽量减少操作系统正在做的其他事情,以帮助提高您的计时在应用程序中更好地工作的可能性。例如:在您尝试使用其他代码获得精确计时时,没有背景视频转码或磁盘碎片整理或任何东西!!

总结:

  1. 如果您真的需要这个,请使用实时操作系统
  2. 如果您不能使用实时操作系统(不可能或不切实际),提高您的进程优先级可能会大大改善您的时间安排,就像我所做的那样
  3. HW 中断不会这样做......操作系统仍然需要决定为它们提供服务!
  4. 确保您没有运行许多其他进程来争夺操作系统的注意力
  5. 如果时机对您来说真的很重要,请进行一些测试。虽然让代码在您希望的时间准确运行不是很容易,但测量这种偏差非常容易。 PC 中的高性能计数器(通过 QueryPerformanceCounter 获得的)非常好。

因为它可能会有帮助(虽然有点偏离主题),所以这是我很久以前写的一个小类,用于在 Windows 机器上使用高性能计数器。它可能对您的测试有用:

CHiResTimer.h

#pragma once
#include "stdafx.h"
#include <windows.h>

class CHiResTimer
{
private:
    LARGE_INTEGER frequency;
    LARGE_INTEGER startCounts;
    double ConvertCountsToSeconds(LONGLONG Counts);
public:
    CHiResTimer(); // constructor
    void ResetTimer(void);
    double GetElapsedTime_s(void);
};

CHiResTimer.cpp

#include "stdafx.h"
#include "CHiResTimer.h"

double CHiResTimer::ConvertCountsToSeconds(LONGLONG Counts)
{
    return ((double)Counts / (double)frequency.QuadPart) ;
}

CHiResTimer::CHiResTimer()
{
    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&startCounts); // starts the timer right away
}

void CHiResTimer::ResetTimer()
{
    QueryPerformanceCounter(&startCounts); // reset the reference counter
}

double CHiResTimer::GetElapsedTime_s()
{
    LARGE_INTEGER countsNow;
    QueryPerformanceCounter(&countsNow);
    return ConvertCountsToSeconds(countsNow.QuadPart - startCounts.QuadPart);
}

关于c++ - 睡了一个确切的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209408/

有关c++ - 睡了一个确切的时间的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  7. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  10. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

随机推荐