equal
deleted
inserted
replaced
282 dc.DrawRectangle(0, 0, *dc.GetSizeTuple()) |
282 dc.DrawRectangle(0, 0, *dc.GetSizeTuple()) |
283 if self._bitmap: |
283 if self._bitmap: |
284 dc.DrawBitmap(self._bitmap, 0, 0, True) |
284 dc.DrawBitmap(self._bitmap, 0, 0, True) |
285 |
285 |
286 |
286 |
287 from threading import Lock,Timer |
287 from threading import Lock,Timer,currentThread |
|
288 MainThread = currentThread().ident |
288 REFRESH_PERIOD = 0.1 |
289 REFRESH_PERIOD = 0.1 |
289 from time import time as gettime |
290 from time import time as gettime |
290 class LogPseudoFile: |
291 class LogPseudoFile: |
291 """ Base class for file like objects to facilitate StdOut for the Shell.""" |
292 """ Base class for file like objects to facilitate StdOut for the Shell.""" |
292 def __init__(self, output, risecall): |
293 def __init__(self, output, risecall): |
297 self.output = output |
298 self.output = output |
298 self.risecall = risecall |
299 self.risecall = risecall |
299 # to prevent rapid fire on rising log panel |
300 # to prevent rapid fire on rising log panel |
300 self.rising_timer = 0 |
301 self.rising_timer = 0 |
301 self.lock = Lock() |
302 self.lock = Lock() |
|
303 self.YieldLock = Lock() |
302 self.RefreshLock = Lock() |
304 self.RefreshLock = Lock() |
303 self.stack = [] |
305 self.stack = [] |
304 self.LastRefreshTime = gettime() |
306 self.LastRefreshTime = gettime() |
305 self.LastRefreshTimer = None |
307 self.LastRefreshTimer = None |
306 |
308 |
311 current_time = gettime() |
313 current_time = gettime() |
312 if self.LastRefreshTimer: |
314 if self.LastRefreshTimer: |
313 self.LastRefreshTimer.cancel() |
315 self.LastRefreshTimer.cancel() |
314 self.LastRefreshTimer=None |
316 self.LastRefreshTimer=None |
315 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
317 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
316 wx.CallAfter(self._write) |
318 self._should_write() |
317 else: |
319 else: |
318 self.LastRefreshTimer = Timer(REFRESH_PERIOD, wx.CallAfter, [self._write]) |
320 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._should_write) |
319 self.LastRefreshTimer.start() |
321 self.LastRefreshTimer.start() |
|
322 |
|
323 def _should_write(self): |
|
324 wx.CallAfter(self._write) |
|
325 if MainThread == currentThread().ident: |
|
326 app = wx.GetApp() |
|
327 if app is not None: |
|
328 if self.YieldLock.acquire(0): |
|
329 app.Yield() |
|
330 self.YieldLock.release() |
320 |
331 |
321 def _write(self): |
332 def _write(self): |
322 if self.output : |
333 if self.output : |
323 self.output.Freeze(); |
334 self.output.Freeze(); |
324 self.lock.acquire() |
335 self.lock.acquire() |