@@ -93,7 +93,8 @@ class ThreadBasedCyclicSendManager(object):
9393
9494 def __init__ (self , send ):
9595 """
96- :param send: A callable function to transmit one :class:`can.Message`.
96+ :param send:
97+ A callable function to transmit one :class:`can.Message`.
9798 """
9899 self .send = send
99100 self .scheduler = sched .scheduler (time .time , time .sleep )
@@ -102,23 +103,25 @@ def __init__(self, send):
102103 def add_task (self , task ):
103104 """Add task to be transmitted periodically.
104105
105- :param can.broadcastmanager.SimpleCyclicSendTask: Task to schedule
106+ :param can.broadcastmanager.ThreadBasedCyclicSendTask task:
107+ Task to schedule
106108 """
107- self ._schedule_task (task , 0 )
109+ self ._schedule_task (task )
108110 if self .thread is None or not self .thread .is_alive ():
109111 self .thread = threading .Thread (target = self .scheduler .run )
110112 self .thread .daemon = True
111113 self .thread .start ()
112114
113- def _schedule_task (self , task , delay ):
114- self .scheduler .enter ( delay , task .message .arbitration_id ,
115- self ._transmit , (task , ))
115+ def _schedule_task (self , task ):
116+ self .scheduler .enterabs ( task . next_time , task .message .arbitration_id ,
117+ self ._transmit , (task , ))
116118
117119 def _transmit (self , task ):
118120 if not task .stopped and (task .end_time is None or
119121 time .time () <= task .end_time ):
120- self ._schedule_task (task , task .period )
121122 self .send (task .message )
123+ task .next_time += task .period
124+ self ._schedule_task (task )
122125
123126
124127class ThreadBasedCyclicSendTask (ModifiableCyclicTaskABC ,
@@ -132,6 +135,7 @@ def __init__(self, bus, message, period, duration=None):
132135 bus .cyclic_manager = ThreadBasedCyclicSendManager (bus .send )
133136 self .bus = bus
134137 self .stopped = False
138+ self .next_time = time .time ()
135139 self .end_time = time .time () + duration if duration else None
136140 self .start ()
137141
0 commit comments