--- a/Beremiz.py Wed Oct 31 12:05:44 2012 +0100
+++ b/Beremiz.py Sat Nov 03 17:00:26 2012 +0100
@@ -211,9 +211,16 @@
if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False):
- self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._should_write)
+ self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) self.LastRefreshTimer.start()
+ def _timer_expired(self): + if self.RefreshLock.acquire(False): + self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) + self.LastRefreshTimer.start() wx.CallAfter(self._write)
if MainThread == currentThread().ident:
@@ -225,7 +232,7 @@
for s, style in self.stack:
if style is None : style=self.black_white
@@ -247,7 +254,7 @@
if newtime - self.rising_timer > 1:
self.rising_timer = newtime
def write_warning(self, s):
self.write(s,self.red_white)
--- a/graphics/GraphicCommons.py Wed Oct 31 12:05:44 2012 +0100
+++ b/graphics/GraphicCommons.py Sat Nov 03 17:00:26 2012 +0100
@@ -27,7 +27,7 @@
-from threading import Semaphore
+from threading import Lock,Timer #-------------------------------------------------------------------------------
@@ -293,6 +293,7 @@
#-------------------------------------------------------------------------------
+DEBUG_REFRESH_LOCK = Lock() @@ -305,10 +306,10 @@
self.LastRefreshTime = gettime()
- self.RefreshLock = Semaphore()
+ self.HasAcquiredLock = False + self.AccessLock = Lock() - self.RefreshTimer = wx.Timer(self, -1)
- self.Bind(wx.EVT_TIMER, self.OnRefreshTimer, self.RefreshTimer)
+ self.LastRefreshTimer = None self.SetDataProducer(producer)
@@ -366,15 +367,26 @@
self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer)
- def OnRefreshTimer(self, event):
+ def ShouldRefresh(self): + if DEBUG_REFRESH_LOCK.acquire(False): + self.AccessLock.acquire() + self.HasAcquiredLock = True + self.AccessLock.release() + self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) + self.LastRefreshTimer.start() def NewDataAvailable(self, *args, **kwargs):
- self.RefreshTimer.Stop()
+ if self.LastRefreshTimer is not None: + self.LastRefreshTimer.cancel() + self.LastRefreshTimer=None - if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False):
+ if current_time - self.LastRefreshTime > REFRESH_PERIOD and DEBUG_REFRESH_LOCK.acquire(False): + self.AccessLock.acquire() + self.HasAcquiredLock = True + self.AccessLock.release() self.LastRefreshTime = gettime()
wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs)
@@ -382,12 +394,17 @@
def RefreshViewOnNewData(self, *args, **kwargs):
self.RefreshNewData(*args, **kwargs)
- self.RefreshTimer.Start(int(REFRESH_PERIOD * 1000), oneShot=True)
+ self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) + self.LastRefreshTimer.start() def RefreshNewData(self, *args, **kwargs):
- self.RefreshLock.release()
+ self.AccessLock.acquire() + if self.HasAcquiredLock: + DEBUG_REFRESH_LOCK.release() + self.HasAcquiredLock = False + self.AccessLock.release() #-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------