2012-08-01 5 views
5

¿Hay bibliotecas TimerCallback implementadas mediante STL. No puedo incorporar la dependencia de Boost a mi proyecto.función TimerCallback basada en la plantilla estándar LIbrary sin Boost

El temporizador al vencimiento debe poder devolver la función registrada.

+1

IMO, en lugar de traer una biblioteca, es posible que pueda escribir su propio temporizador de forma rápida y limpia. Engendre un hilo nuevo, llame repetidamente a su función y luego haga que el hilo duerma durante un tiempo. – SuperSaiyan

Respuesta

8

No hay contador de tiempo específico en la biblioteca estándar, pero es bastante fácil de implementar uno:

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

Ejemplo de uso:

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

Mira que la función se invoca en otro hilo, por lo asegúrese de que todos los datos a los que accede estén adecuadamente protegidos.

+0

Buena solución gracias, sin embargo, esto funciona solo en 'clang', g ++ 4.8.2 dice' error 'campo' timer (const Duration &, const Function &) [with Duration = std :: chrono :: duration ; Función = void()] :: __ lambda0 :: __ f 'tipo de función declarada inválidamente'. ¿Algunas ideas? – Avio

+0

@Avio: cambie el argumento a '& hello', para forzar una conversión a un tipo de puntero. (No estoy seguro de si Clang o GCC están deduciendo el tipo correctamente aquí, pero eso debería hacer que ambos hagan lo que quieran). –

Cuestiones relacionadas