2012-08-01 51 views
5

是否使用STL实现了TimerCallback库?我无法将Boost依赖项引入到我的项目中。基于标准模板的TimerCallback函数LIbrary without Boost

到期的计时器应该能够回调注册的功能。

+1

海事组织,而不是引入一个库,你可能能够快速,干净地编写自己的计时器。产生一个新的线程,反复调用你的函数,然后使线程休眠一段时间。 – SuperSaiyan 2012-08-01 16:48:48

回答

8

有标准库没有具体的计时器,但它是很容易实现一个:利用

#include <thread> 

template <typename Duration, typename Function> 
void timer(Duration const & d, Function const & f) 
{ 
    std::thread([d,f](){ 
     std::this_thread::sleep_for(d); 
     f(); 
    }).detach(); 
} 

例子:

#include <chrono> 
#include <iostream> 

void hello() {std::cout << "Hello!\n";} 

int main() 
{ 
    timer(std::chrono::seconds(5), &hello); 
    std::cout << "Launched\n"; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
} 

要注意的是在功能上的另一个线程调用,所以确保它访问的任何数据都得到适当的保护。

+0

不错的解决方案谢谢你,但是,这只适用于'clang',g ++ 4.8.2说'error:field'timer(const Duration&,const Function&)[with Duration = std :: chrono :: duration ; Function = void()] :: __ lambda0 :: __ f'无效声明函数类型'。有任何想法吗? – Avio 2014-12-09 12:59:37

+0

@Avio:将参数改为'&hello',强制转换为指针类型。 (我不确定Clang或GCC是否在这里正确地推断出这种类型,但是这应该使得两者都能做到你想要的)。 – 2014-12-09 13:07:05