需要在c ++中以周期性的时间间隔调用函数

Exe*_*1ve 14 c++ timer visual-c++

我正在用c ++编写一个程序,我需要定期调用一个函数,比如每10ms左右.我从来没有做过与c ++中的时间或时钟相关的任何事情,这是一个快速简单的问题还是没有简洁解决方案的问题之一?

谢谢!

use*_*498 16

一个简单的计时器可以实现如下,

#include <iostream>
#include <chrono>
#include <thread>
#include <functional>

void timer_start(std::function<void(void)> func, unsigned int interval)
{
    std::thread([func, interval]() {
        while (true)
        {
            func();
            std::this_thread::sleep_for(std::chrono::milliseconds(interval));
        }
    }).detach();
}


void do_something()
{
    std::cout << "I am doing something" << std::endl;
}

int main() {
    timer_start(do_something, 1000);

    while(true);
}
Run Code Online (Sandbox Code Playgroud)

这个简单的解决方案不提供停止计时器的方法.计时器将继续运行,直到程序退出.

  • @ user534498不幸的是,你的解决方案不会按照他的要求做.它会在调用之间执行`func`并且`interval`延迟.它不会在每个`interval`执行`func`.如果`func`可能需要一些可变时间来运行,启动时间也会有所不同. (12认同)

flo*_*eng 11

要完成此问题,可以轻松调整@ user534498中的代码以使其具有周期性的滴答间隔.只需要确定定时器线程循环的开始时间和sleep_until执行该函数后的那个时间点的下一个开始时间点.

#include <iostream>
#include <chrono>
#include <thread>
#include <functional>

void timer_start(std::function<void(void)> func, unsigned int interval)
{
  std::thread([func, interval]()
  { 
    while (true)
    { 
      auto x = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval);
      func();
      std::this_thread::sleep_until(x);
    }
  }).detach();
}

void do_something()
{
  std::cout << "I am doing something" << std::endl;
}

int main()
{
  timer_start(do_something, 1000);
  while (true)
    ;
}
Run Code Online (Sandbox Code Playgroud)

  • @EdisonLo 您可以使用 std::bind 将参数绑定到函数。例如:`do_something2(int i)` 并且你想用 i=25 调用它然后调用`timer_start(std::bind(do_something2,25),1000)` (3认同)
  • 这是正确的方法,只是要注意`func()`必须在`sleep_until`结束之前完成! (2认同)
  • 您可以通过增加目标时间来避免漂移(不是避免,而是考虑),然后等待。这段代码不断根据 now() 重新计算目标时间,因此它会根据睡眠之间的时间间隔而发生变化。(这通常没问题。) (2认同)

小智 0

你可以研究一下线程:

这是用 C 实现的时间间隔控制函数,使用 pthread.h,它应该是 C++ 的简单移植。 以特定时间间隔执行函数