Skip to content

Commit df8030d

Browse files
Make thread based cyclic task more accurate
1 parent 3eb1c7b commit df8030d

2 files changed

Lines changed: 12 additions & 8 deletions

File tree

can/broadcastmanager.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

124127
class 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

test/simplecyclic_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_cycle_time(self):
1818
print(size)
1919
# About 100 messages should have been transmitted. Some overhead will
2020
# make it less though
21-
self.assertTrue(75 < size < 110)
21+
self.assertTrue(90 < size < 110)
2222
last_msg = bus.recv()
2323
self.assertEqual(last_msg, msg)
2424

0 commit comments

Comments
 (0)