281 dc.DrawRectangle(0, 0, *dc.GetSizeTuple()) |
281 dc.DrawRectangle(0, 0, *dc.GetSizeTuple()) |
282 if self._bitmap: |
282 if self._bitmap: |
283 dc.DrawBitmap(self._bitmap, 0, 0, True) |
283 dc.DrawBitmap(self._bitmap, 0, 0, True) |
284 |
284 |
285 |
285 |
286 from threading import Lock |
286 from threading import Lock,Timer |
287 REFRESH_PERIOD = 0.1 |
287 REFRESH_PERIOD = 0.1 |
288 from time import time as gettime |
288 from time import time as gettime |
289 class LogPseudoFile: |
289 class LogPseudoFile: |
290 """ Base class for file like objects to facilitate StdOut for the Shell.""" |
290 """ Base class for file like objects to facilitate StdOut for the Shell.""" |
291 def __init__(self, output, risecall): |
291 def __init__(self, output, risecall): |
299 self.rising_timer = 0 |
299 self.rising_timer = 0 |
300 self.lock = Lock() |
300 self.lock = Lock() |
301 self.RefreshLock = Lock() |
301 self.RefreshLock = Lock() |
302 self.stack = [] |
302 self.stack = [] |
303 self.LastRefreshTime = gettime() |
303 self.LastRefreshTime = gettime() |
|
304 self.LastRefreshTimer = None |
304 |
305 |
305 def write(self, s, style = None): |
306 def write(self, s, style = None): |
306 if self.lock.acquire(): |
307 if self.lock.acquire(): |
307 self.stack.append((s,style)) |
308 self.stack.append((s,style)) |
308 self.lock.release() |
309 self.lock.release() |
309 current_time = gettime() |
310 current_time = gettime() |
|
311 if self.LastRefreshTimer: |
|
312 self.LastRefreshTimer.cancel() |
|
313 self.LastRefreshTimer=None |
310 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
314 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
311 wx.CallAfter(self._write) |
315 wx.CallAfter(self._write) |
|
316 else: |
|
317 self.LastRefreshTimer = Timer(REFRESH_PERIOD, wx.CallAfter, [self._write]) |
|
318 self.LastRefreshTimer.start() |
312 |
319 |
313 def _write(self): |
320 def _write(self): |
314 self.output.Freeze(); |
321 self.output.Freeze(); |
315 self.lock.acquire() |
322 self.lock.acquire() |
316 for s, style in self.stack: |
323 for s, style in self.stack: |
323 self.stack = [] |
330 self.stack = [] |
324 self.lock.release() |
331 self.lock.release() |
325 self.output.ShowPosition(self.output.GetLastPosition()) |
332 self.output.ShowPosition(self.output.GetLastPosition()) |
326 self.output.Thaw() |
333 self.output.Thaw() |
327 self.LastRefreshTime = gettime() |
334 self.LastRefreshTime = gettime() |
328 self.RefreshLock.release() |
335 try: |
|
336 self.RefreshLock.release() |
|
337 except: |
|
338 pass |
329 newtime = time.time() |
339 newtime = time.time() |
330 if newtime - self.rising_timer > 1: |
340 if newtime - self.rising_timer > 1: |
331 self.risecall() |
341 self.risecall() |
332 self.rising_timer = newtime |
342 self.rising_timer = newtime |
333 |
343 |