在JavaScript中,有一个名为setInterval()
的函数。它可以用C ++实现吗?如果使用循环,程序不会继续,而是继续调用函数。
while(true) {
Sleep(1000);
func();
}
cout<<"Never printed";
答案 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);