c++ - 在 C++ 中使用 setInterval()

标签 c++

在 JavaScript 中,有一个名为 setInterval() 的函数。可以用C++实现吗?如果使用循环,程序不会继续,而是继续调用函数。

while(true) {
    Sleep(1000);
    func();
}
cout<<"Never printed";

最佳答案

C++ 中没有内置setInterval。你可以用异步函数模仿这个函数:

template <class F, class... Args>
void setInterval(std::atomic_bool& cancelToken,size_t interval,F&& f, Args&&... args){
  cancelToken.store(true);
  auto cb = std::bind(std::forward<F>(f),std::forward<Args>(args)...);
  std::async(std::launch::async,[=,&cancelToken]()mutable{
     while (cancelToken.load()){
        cb();
        std::this_thread::sleep_for(std::chrono::milliseconds(interval));
     }
  });
}

使用cancelToken取消间隔

cancelToken.store(false);

请注意,此机制为任务构建了一个新线程。它不适用于许多区间函数。在这种情况下,我会使用已经编写好的线程池和某种时间测量机制。

编辑:示例使用:

int main(int argc, const char * argv[]) {
    std::atomic_bool b;
    setInterval(b, 1000, printf, "hi there\n");
    getchar();
}

关于c++ - 在 C++ 中使用 setInterval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33234403/

相关文章:

c++ - SFINAE 或 enable_if 检查非类型模板参数是偶数还是奇数

c# - BulletPhysics/BulletSharp 中的多线程?

c++ - 读取 fifo : why is it blocking then non-blocking

c++ - 为什么计算出的可用和总驱动器空间上限为 2G?

c++ - 使用(mock)头文件作为模板时的“Multiple definition”

c++ - 为什么编译器选择下面的模板版本?

c++ - 在 VC++ 中使用模板时出现 C4430 错误

c++ - 图像深度和 channel 之间的差异

c++ - 嵌入式 Linux 上的轻量级调试

c++ - 虚拟文件系统设计