Commit 1eaa0840 authored by Paul McCarthy's avatar Paul McCarthy 🚵
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
......@@ -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:
_idleRegistered = False
_idleQueue = queue.Queue()
_idleQueueDict = {}
......@@ -220,6 +221,11 @@ def idleReset():
_idleCallRate = 200
# Call idleReset on exit, in
# case the idleTimer is active.
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(
except KeyError: pass
# More tasks on the queue?
# Request anotherd event
if _idleQueue.qsize() > queueSizeOffset:
# Otherwise use the idle
# timer to make sure that
# the loop keeps ticking
# over
_idleTimer.Start(_idleCallRate, wx.TIMER_ONE_SHOT)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment