[asio] 1.37.0: trouble with multiple timers and serial line port
Hi! Using boost-1.37.0 Having some trouble with multiple timers in one class. Looks like the timers are going berserk when MemFun1() calls Process(): The expiration wait times then are ignored and the whole loop seesm to run as if timers are all set to 0. Any idea what went wrong? A little code sketch (does not compile) class Communicator { // the main IO service that runs this connection boost::asio::io_service io_service_; // the serial port this instance is connected to boost::asio::serial_port SerialPort_; // maximum amount of data to read in one operation static const int max_read_length = 256; // data read from the socket char read_msg_[max_read_length]; std::deque<char> received_data_; // buffered write data std::deque<char> write_msgs_; boost::thread * pThreadRead_; // etc. // timers boost::asio::deadline_timer timer1_; boost::asio::deadline_timer timer2_; // etc. // missing: // the whole async_write/async_read_some to serial line stuff void Process() { // MISSING CODE: // ... fill the send queue of the serial line cache and fire // async_write on serial port ... // Q: does this probaly interfere StartMemfun(0); } void StartMemFun1(int counter) { timer1_.cancel(); // Q: Is this necessary here? timer1_.expires_from_now(boost::posix_time::milliseconds(1000)); timer1_.async_wait(bind(MemFun1, this, counter)); } void MemFun1(int counter) { if (!(counter < 5)) Process(); bool success; // ... process data from read cache if (success) StartMemfun2(0); else StartMemFun1(counter + 1); // this here works fine! } void StartMemFun2(int counter) { timer2_.cancel(); // Q: Is this necessary here? timer2_.expires_from_now(boost::posix_time::milliseconds(1000)); timer2_.async_wait(bind(MemFun2, this, counter)); } void MemFun2(int counter) { if (!(counter < 5)) Process(); bool success; // ... process data from read cache if (success) StartMemfun2(counter + 1); else StartMemFun1(counter + 1); } };
timer1_.cancel(); // Q: Is this necessary here? timer1_.expires_from_now(boost::posix_time::milliseconds(1000)); timer1_.async_wait(bind(MemFun1, this, counter));
I can't understand why you want to cancel the timer here. Anyway, you'd better post some minimal code that compiles and runs (it shouldn't be classes with ports etc., just main(), timers and plain function handlers).
Markus Werle
if (success) StartMemfun2(counter + 1); else StartMemFun1(counter + 1);
will return immediately. This lead to multiple calls of the same function in code not shown here. Sorry for the noise :-( Markus
participants (2)
-
Igor R
-
Markus Werle