【问题标题】:What is the recommended or most precise way, to call a function after a specific time?在特定时间后调用函数的推荐或最精确的方法是什么?
【发布时间】:2019-10-17 10:23:08
【问题描述】:

我编写了一个小程序来启动和录制摄像机的立体设置。我想记录一个 100 毫秒的序列。问题是:我不知道如何以尽可能高的精度为函数计时。我找到了标题<unistd.h>,其中包括函数usleep,它可以将执行暂停指定的微秒间隔。所以在我的程序中,我正在做这样的事情:

left_camera.start_recording();
right_camera.start_recording();
usleep(100000);
left_camera.stop_recording();
right_camera.stop_recording();

有没有更好的方法来确保两个函数之间的精确计时?

【问题讨论】:

  • 没有单一的推荐方式。根据您拥有的 unix 版本(linux 与 BSD 与 .... ,内核版本等),有不同的方法可以实现效果。选择也可能受到硬件能力的影响(例如,是否有高精度硬件定时器)。您需要阅读特定系统的文档。
  • 不幸的是,这并不能确保您的睡眠时间不少于 100 毫秒。来自man usleep:“系统活动可能会将睡眠时间延长一个不确定的量。”放弃“尽可能高的精度”的想法,决定你真正需要的精度。然后您就可以开始寻找解决方案了。
  • 有一些方法可以获得纳秒甚至皮秒的精度,但并非没有投入大量精力(和专用硬件)。 “尽可能高的精度”太不精确了。您真正需要什么精度?
  • 您需要睡眠,还是需要 100 毫秒的延迟?忙等待是一种选择吗?
  • @divinas 我只需要延迟。我希望摄像机录制 100 毫秒。 “忙于等待”是什么意思?可能是一种选择。

标签: c++ timing


【解决方案1】:

你也可以使用 std::this_thread::sleep_for (C++11)

#include <chrono>
#include <thread>

int main()
{
    std::this_thread::sleep_for(std::chrono::nanoseconds(500));
}

【讨论】:

  • sleep_for 睡眠至少指定的时间跨度。没有正式的上限。
  • @molbdnilo 如果你能从操作系统调度程序控制下运行的任何东西中获得正式的上限,我会感到惊讶。
【解决方案2】:

sleep 并不是实现计时器的更好方法。您可以使用 c++ boost 库中的 asio 异步计时器功能。您可以创建计时器,这将在计时器到期后调用注册函数

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void func(const boost::system::error_code&)
{
    std::cout << "in func" << std::endl;
}

int main()
{
  boost::asio::io_service io;
  boost::asio::deadline_timer t(io, boost::posix_time::seconds(0.1));
  t.async_wait(&func);
  io.run();
  return 0;
}

编译时链接 libboost_system 库
欲了解更多信息,请参阅:

https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/tutorial.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2016-12-20
    • 2017-07-18
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多