【问题标题】:Perform function at certain clock time在特定时钟时间执行功能
【发布时间】:2013-07-10 16:09:48
【问题描述】:

我希望用户输入时间,例如1400h - 这将导致函数在 1400h 运行。

我该怎么做?

上下文:我有一个在同一台计算机上工作的客户端-服务器程序 - 我需要多个节点同时发送消息(这就是上面的功能)

编辑:理想情况下,我不想使用sleep() 函数,因为问题是客户端将在不同时间启动,并且作为一种解决方案来调用导致函数在1400 小时。

【问题讨论】:

  • 我确信有足够多的 C++ cron 模块。尝试使用其中之一。
  • 你需要以某种形式调用 sleep(),没有办法。

标签: c++ clock


【解决方案1】:

你可以使用std::this_thread::sleep_until,例如

void main()
{
     auto fire_time = /**/;

     std::thread thread([&]
     {
          std::this_thread::sleep_until(fire_time);
          fire();
     });
     thread.join();       
}

您可以将其重构为一个辅助函数,这可能是您正在寻找的:

template<class Func, class Clock, class Duration>
void run_at(Func&& func, const std::chrono::time_point<Clock,Duration>& sleep_time)
{
    std::thread(std::bind([&](const Func& func)
    {
        std::this_thread::sleep_until(sleep_time);
        func();
    }, std::move(func)))
    .detach();
}

【讨论】:

  • 我将如何使用它 - 我有多个线程在程序中运行(而且我对使用线程很陌生!)。我可以将要调用的函数隔离到单独的线程中,但是如何在特定线程上调用sleep_until()
  • 不,"std::this_thread::sleep_until" 回答你的问题?它将在“this”线程上休眠,即调用函数的线程。
【解决方案2】:

如果程序一直在运行,请使用 sleep 等函数来等待从现在到 1400 小时之间的时间量。您可能需要在单独的线程中执行此操作以允许程序执行其他操作,或者将 sleep 替换为事件循环超时(如果程序是基于事件循环的)。

如果程序必须退出,那么您必须使用系统工具(例如 Unix 上的at)来安排重新启动程序并在指定时间执行代码。

【讨论】:

  • 我不想使用sleep(x),因为客户端将在不同时间启动 - 但我希望它们同时触发。我会在问题中更新这个!
  • @sccs 没错,这就是为什么sleep(x) 中的x 必须是从现在到1400 小时之间的时间量
【解决方案3】:

我相信您需要某种任务管理器。这是一个基本模型。培育睡眠线是非常错误的方式来完成这项工作。单个经理将知道何时运行下一个任务。如何运行任务是另一个问题。如果您希望它们具有交互性,您可以为每个任务创建新线程。或者您可以将它们序列化并从管理器线程中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多