Skip to content
Snippets Groups Projects
Commit 1eaa0840 authored by Paul McCarthy's avatar Paul McCarthy :mountain_bicyclist:
Browse files

The async module ensures that the idle timer is stopped on exit. If this

isn't done, segfaults may sporadically occur.
parent c87db8f3
No related branches found
No related tags found
No related merge requests found
......@@ -77,13 +77,11 @@ Other facilities
The ``async`` module also defines the :func:`mutex` decorator, which is
intended to be used to mark the methods of a class as being mutually exclusive.
The ``mutex`` decorator uses the :class:`MutexFactory` class to do its work.
.. todo:: You could possibly use ``props.callqueue`` to drive the idle loop.
"""
import time
import atexit
import logging
import functools
import threading
......@@ -213,6 +211,9 @@ def idleReset():
global _idleTimer
global _idleCallRate
if _idleTimer is not None:
_idleTimer.Stop()
_idleRegistered = False
_idleQueue = queue.Queue()
_idleQueueDict = {}
......@@ -220,6 +221,11 @@ def idleReset():
_idleCallRate = 200
# Call idleReset on exit, in
# case the idleTimer is active.
atexit.register(idleReset)
def getIdleTimeout():
"""Returns the current ``wx`` idle loop time out/call rate.
"""
......@@ -306,7 +312,7 @@ def _wxIdleLoop(ev):
if taskName is None: taskName = funcName
else: taskName = '{} [{}]'.format(taskName, funcName)
# Has enouggh time elapsed
# Has enough time elapsed
# since the task was scheduled?
# If not, re-queue the task.
# If this is the only task on the
......@@ -333,8 +339,15 @@ def _wxIdleLoop(ev):
try: _idleQueueDict.pop(task.name)
except KeyError: pass
# More tasks on the queue?
# Request anotherd event
if _idleQueue.qsize() > queueSizeOffset:
ev.RequestMore()
# Otherwise use the idle
# timer to make sure that
# the loop keeps ticking
# over
else:
_idleTimer.Start(_idleCallRate, wx.TIMER_ONE_SHOT)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment