
As far as I could understand, the deadline_timer just runs once, i.e., if I would like to use it multiple times, I have to instantiate new ones everytime.
It's absolutely incorrect. Did you see asio exmaples/reference? On expiration or cancellation the timer invokes its handler - in the thread(s) of its io_service. Then you can start the same timer again: //... timer.expires_from_now(boost::ptime::seconds(5)); time.async_wait(&handler); //... void handler() { // start it again: timer.expires_from_now(boost::ptime::seconds(10)); timer.async_wait(&handler); }
It needs to be turned on inside a separate thread, the command queue one, when it sends a serial command, and if the answer arives before the timer is due, it has to be turned off, again inside that separate queue thread, so it doesn't hit the "resend".
The timer itself is not thread-safe, i.e. you have to start/cancel it from the thread(s) of its io_service. The most convenient way to deal with it is to make your queue processing io_service-based -- then you can just supply the same io_service to the timer. If it's not possible, you can perform timer-related operations from your queue thread by re-posting them to the timer thread, no locking is needed: void doCancel() { timer.cancel(); } void cancelFromAnotherThread() { timer.get_io_service().post(&doCancel); } ...and when timer handler is invoked (on timer.io_service thread), you just have to synchronize an access to your queue data, if needed.