【问题标题】:Deferred function call in C/C++C/C++ 中的延迟函数调用
【发布时间】:2014-08-07 09:26:40
【问题描述】:

如何在一段时间后或特定时间调用 C++ 中的函数?
我在 Google 和 Stackoverflow 中进行了搜索。我只找到了通过 SIGALARM 处理程序执行此操作的方法。

更新 1:
附言我使用 Linux。
附言我没有任何书面代码,因为我想在写之前知道如何做到这一点。

【问题讨论】:

  • 我已经更新了我的问题。
  • 你可以用gotos 来做,但它会让代码看起来有点像意大利面条,有时更难理解。 (我假设你想在函数返回之前做一些事情)

标签: c++ function time call


【解决方案1】:

您可能希望在另一个一次性线程中执行此操作,因为在主线程中等待会阻塞您的应用程序。您可以使用std::this_thread::sleep_for 在该线程中添加延迟。

using namespace std;
thread([]{this_thread::sleep_for(chrono::milliseconds(1000)); foo(); }).detach();

【讨论】:

    【解决方案2】:

    在 C 中执行此操作的 POSIX 方法是通过使用 SIGALARM 设置信号处理程序并在其中包含您想要调用的函数。在这种情况下,您赋予操作系统(某种意义上的)责任,一旦时机成熟就会给您打电话。

    C++11 的实现方式是通过 std::thread 和 std::chrono。一个很简单,可能不完整的例子:

    std::chrono::milliseconds duration( 2000 );
    auto deferred_task = [duration] () { std::this_thread::sleep_for(duration); call_task(); }
    std::thread t(deferred_task);
    

    在这个准系统示例中,您的程序是多线程的,一个线程负责进行延迟调用(在另一个线程中)。您可能想要加入、捕获返回值以及任何您想要的,同步或异步。

    您想要一个多线程应用程序还是需要一个单线程信号 C 行为?这是非常关键的,它将成为您对代码风格的主要约束。

    【讨论】:

      【解决方案3】:

      如果您有权访问 Boost 库,请尝试回答 question。您可以定期调用您的函数,也可以一次性调用。

      【讨论】:

        【解决方案4】:

        尝试使用计时器。或者在linux中使用epoll。还有类似 Windows 中的 waitforsingleobject。

        【讨论】:

          【解决方案5】:

          您实际上可以通过一种超级简单的方式来做到这一点:

          void example(void (*f)()) {
            struct defer {
              void (*f)();
              ~defer() { f(); }
            } _[[maybe_unused]] { f };
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-18
            • 2017-06-24
            • 1970-01-01
            相关资源
            最近更新 更多