Beremiz.py
changeset 705 a5977f64d4d9
parent 704 5993b16fe2d0
child 710 d76f73c7ae5e
equal deleted inserted replaced
704:5993b16fe2d0 705:a5977f64d4d9
   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()