C++ 在C++;
在JavaScript中,有一个名为C++ 在C++;,c++,C++,在JavaScript中,有一个名为setInterval()的函数。它能在C++中实现吗?如果使用循环,程序不会继续,而是继续调用函数 while(true) { Sleep(1000); func(); } cout<<"Never printed"; while(true){ 睡眠(1000); func(); } 不能使用std::thread来实现 // <thread> should have been included void setIn
setInterval()
的函数。它能在C++中实现吗?如果使用循环,程序不会继续,而是继续调用函数
while(true) {
Sleep(1000);
func();
}
cout<<"Never printed";
while(true){
睡眠(1000);
func();
}
不能使用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);
//应该包括在内
无效设置间隔(自动功能,整数间隔){
螺纹th([&](){
while(true){
睡眠(间歇);
函数();
}
});
th.detach();
}
//...
setInterval([](){
CUT< P> C++中没有内置代码<代码StTeals。可以用异步函数模拟这个函数:
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));
}
});
}
但是请注意,这个mchanism为任务构造了一个新线程。它不适用于许多间隔函数。在这种情况下,我将使用已经编写的线程池和某种时间测量机制
编辑:示例使用:
int main(int argc, const char * argv[]) {
std::atomic_bool b;
setInterval(b, 1000, printf, "hi there\n");
getchar();
}
void setInterval(){}
…但我假设您也在要求JavaScript函数的功能性…那到底是什么呢?---没关系,简短的回答:是的,可以实现。较长的回答:要真正模拟JavaScriptsetInterval
功能,您需要实现某种形式的同步上下文和调度系统由于JavaScript是单线程的,因此setInterval
的所有处理程序调用都被分派到“主”线程。这对于从头开始实现来说是非常重要的。下一个挑剔:不包括特定于平台的函数Sleep()
。我建议改为使用。为什么它说线程未在此范围内声明
我使用的是g++-std=c++11
编译器你能给我一个例子来说明如何使用它吗?c++优点的完美例子:内部丑陋,外部界面非常漂亮。@DevSolar:是的,这个例子鼓励你我想进一步探讨C++的用法:使用代码> STD::绑定< /代码>?这是否比写“代码> f(STD::Ord:ARG)…)有任何优势?在while循环中?这不会复制JavaScript的setInterval
。此实现会漂移。首先,它不考虑执行cb()
/f()所需的时间
,也不尊重
的sleep\u的语义。这可能是问题,也可能不是问题,但应该在回答中指出。
int main(int argc, const char * argv[]) {
std::atomic_bool b;
setInterval(b, 1000, printf, "hi there\n");
getchar();
}