在C ++中使用setInterval()

时间:2015-10-20 10:37:12

标签: c++

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

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

2 个答案:

答案 0 :(得分:5)

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();
}

答案 1 :(得分:1)

使用std::thread来实现。

// <thread> should have been included
void setInterval(auto function,int interval) {
    thread th([&]() {
        while(true) {
            Sleep(interval);
            function();
        }
    });
    th.detach();
}
//...
setInterval([]() {
    cout<<"1 sec past\n";
},
1000);