boost asio deadline_timer async_wait (N segundos) duas vezes dentro de N segundos causa a operação cancelada
O que eu quero é que quando uma fila de mensagens receber um int N, a função de manipulador será chamada após N segundos. abaixo está o meu código.
Ele funciona OK se os segundos de duração de duas filas de mensagens próximas forem maiores que o N int, mas o manipulador imprimirá "Operação cancelada" em um manipulador quando os segundos de duração entre duas filas de mensagens recebidas forem menores que N, o que não é o que eu quer.
Eu apreciaria muito por qualquer ajuda.
#include <boost/asio.hpp>
#include <zmq.h>
#include <boost/thread.hpp>
#include <iostream>
boost::asio::io_service io_service;
void* context = zmq_ctx_new();
void* sock_pull = zmq_socket(context, ZMQ_PULL);
void handler(const boost::system::error_code &ec) {
std::cout << "hello, world" << "\t" << ec.message() << std::endl;
}
void run() {
io_service.run();
}
void thread_listener() {
int nRecv;
boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(0));
while( true ) {
zmq_recv(sock_pull, &nRecv, sizeof(nRecv), 0);
std::cout << nRecv << std::endl;
timer.expires_from_now(boost::posix_time::seconds(nRecv));
timer.async_wait(handler);
}
}
int main(int argc, char* argv[]) {
boost::asio::io_service::work work(io_service);
zmq_bind(sock_pull, "tcp://*:60000");
boost::thread tThread(thread_listener);
boost::thread tThreadRun(run);
tThread.join();
tThreadRun.join();
return 0;
}