diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index 19e6db9df9..c72aeaa601 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -2501,8 +2501,23 @@ class DelayedCall: if delay is None: delay = .01 self._func = func - taskMgr.doMethodLater(delay, self._doCallback, 'DelayedCallback-%s' % name) + self._taskName = 'DelayedCallback-%s' % name + self._delay = delay + self._finished = False + self._addDoLater() + def destroy(self): + self._finished = True + self._removeDoLater() + def finish(self): + if not self._finished: + self._doCallback() + self.destroy() + def _addDoLater(self): + taskMgr.doMethodLater(self._delay, self._doCallback, self._taskName) + def _removeDoLater(self): + taskMgr.remove(self._taskName) def _doCallback(self, task): + self._finished = True func = self._func del self._func func() @@ -2519,11 +2534,15 @@ class FrameDelayedCall: self._callback = callback self._cancelFunc = cancelFunc self._taskName = uniqueName('%s-%s' % (self.__class__.__name__, self._name)) + self._finished = False self._startTask() def destroy(self): + self._finished = True self._stopTask() def finish(self): - self._callback() + if not self._finished: + self._finished = True + self._callback() self.destroy() def _startTask(self): taskMgr.add(self._frameTask, self._taskName)