impulso: en qué hilo vuelve a llamar asio
Aquí volveremos a llamar una vez por segundo para demostrar cómo recuperar el significado de los parámetros de la función
#include
#include
#include
#include
Primero, ajuste la duración del temporizador, inicia una espera asincrónica. Muestra que la función de devolución de llamada necesita acceder al temporizador para implementar operaciones periódicas, por lo que introducimos dos nuevos parámetros
Puntero al temporizador
Un int. * para señalar el contador
void print(const asio::error& /*e*/,
asio::deadline_timer* t, int* count)
{
Tenemos la intención de dejar que esta función se ejecute durante 6 ciclos, sin embargo, encontrará que no hay una forma explícita de terminar io_service. Sin embargo, al mirar la sección anterior, encontrará que cuando asio. ::io_service::run() Terminará cuando se completen todas las tareas. De esta manera, cuando el valor de la calculadora llegue a 5 (0 es el valor de la primera ejecución), no iniciaremos una nueva espera asincrónica. p>
if (*cuenta < 5)
{
std::cout << *cuenta << " ";
++( *count);
...
Luego, posponemos el tiempo de vencimiento del temporizador. Al agregar un retraso al tiempo de vencimiento original, podemos asegurarnos de que el temporizador no lo haga. caducan dentro del tiempo requerido para procesar la función de devolución de llamada.
(Texto original: al calcular el nuevo tiempo de caducidad en relación con el anterior, podemos asegurarnos de que el temporizador no se aleje de la marca de segundo completo. debido a cualquier retraso en el procesamiento del controlador.)
p>t->expires_at(t->expires_at() + boost::posix_time::segundos(1));
Luego comenzamos una nueva espera de sincronización. Como puede ver, usamos la función boost::bind para combinar print y sus múltiples parámetros en una función de devolución de llamada nula (const asio::error&) (objeto de función para ser precisos). p>
En este ejemplo, el parámetro asio::placeholders::error de boost::bind es pasar un objeto de error a la función de devolución de llamada. Al realizar una operación asincrónica e iniciar boost::bind, debe hacerlo. úselo para que coincida con la lista de parámetros de la función de devolución de llamada. En la siguiente sección aprenderá que el parámetro de error se puede omitir cuando la función de devolución de llamada no lo requiere.
t->async_wait(boost: :bind(imprimir,
asio::placeholders ::error, t, recuento));
}
}
int main()
{
asio::io_service io;
int count = 0;
asio::deadline_timer t(io , impulso::posi
x_time::segundos(1));
Igual que arriba, una vez más usamos el enlace asio::deadline_timer::async_wait()
t.async_wait(boost:: bind (print,
asio::placeholders::error, &t, &count));
io.run();
Al final imprimimos El valor del recuento de la última llamada sin temporizador
std::cout << "El recuento final es " << recuento << " ";
devuelve 0;