$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] [asio] 1.37.0: trouble with multiple timers and serial line port
From: Markus Werle (numerical.simulation_at_[hidden])
Date: 2009-03-11 08:58:57
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);
        }
};