303 self.Inhibited = False |
304 self.Inhibited = False |
304 |
305 |
305 self.DataConsumers = {} |
306 self.DataConsumers = {} |
306 |
307 |
307 self.LastRefreshTime = gettime() |
308 self.LastRefreshTime = gettime() |
308 self.RefreshLock = Semaphore() |
309 self.HasAcquiredLock = False |
|
310 self.AccessLock = Lock() |
309 |
311 |
310 self.RefreshTimer = wx.Timer(self, -1) |
312 self.LastRefreshTimer = None |
311 self.Bind(wx.EVT_TIMER, self.OnRefreshTimer, self.RefreshTimer) |
|
312 |
313 |
313 self.SetDataProducer(producer) |
314 self.SetDataProducer(producer) |
314 |
315 |
315 def __del__(self): |
316 def __del__(self): |
316 self.DataProducer = None |
317 self.DataProducer = None |
364 if self.DataProducer is not None: |
365 if self.DataProducer is not None: |
365 for consumer, iec_path in self.DataConsumers.iteritems(): |
366 for consumer, iec_path in self.DataConsumers.iteritems(): |
366 self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer) |
367 self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer) |
367 self.DataConsumers = {} |
368 self.DataConsumers = {} |
368 |
369 |
369 def OnRefreshTimer(self, event): |
370 def ShouldRefresh(self): |
370 self.RefreshNewData() |
371 if DEBUG_REFRESH_LOCK.acquire(False): |
371 event.Skip() |
372 self.AccessLock.acquire() |
|
373 self.HasAcquiredLock = True |
|
374 self.AccessLock.release() |
|
375 self.RefreshNewData() |
|
376 else: |
|
377 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) |
|
378 self.LastRefreshTimer.start() |
372 |
379 |
373 def NewDataAvailable(self, *args, **kwargs): |
380 def NewDataAvailable(self, *args, **kwargs): |
374 self.RefreshTimer.Stop() |
381 if self.LastRefreshTimer is not None: |
|
382 self.LastRefreshTimer.cancel() |
|
383 self.LastRefreshTimer=None |
375 if not self.Inhibited: |
384 if not self.Inhibited: |
376 current_time = gettime() |
385 current_time = gettime() |
377 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
386 if current_time - self.LastRefreshTime > REFRESH_PERIOD and DEBUG_REFRESH_LOCK.acquire(False): |
|
387 self.AccessLock.acquire() |
|
388 self.HasAcquiredLock = True |
|
389 self.AccessLock.release() |
378 self.LastRefreshTime = gettime() |
390 self.LastRefreshTime = gettime() |
379 self.Inhibit(True) |
391 self.Inhibit(True) |
380 wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs) |
392 wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs) |
381 |
393 |
382 def RefreshViewOnNewData(self, *args, **kwargs): |
394 def RefreshViewOnNewData(self, *args, **kwargs): |
383 if self: |
395 if self: |
384 self.RefreshNewData(*args, **kwargs) |
396 self.RefreshNewData(*args, **kwargs) |
385 self.RefreshTimer.Start(int(REFRESH_PERIOD * 1000), oneShot=True) |
397 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) |
|
398 self.LastRefreshTimer.start() |
386 |
399 |
387 def RefreshNewData(self, *args, **kwargs): |
400 def RefreshNewData(self, *args, **kwargs): |
388 self.Inhibit(False) |
401 self.Inhibit(False) |
389 self.RefreshLock.release() |
402 self.AccessLock.acquire() |
390 |
403 if self.HasAcquiredLock: |
|
404 DEBUG_REFRESH_LOCK.release() |
|
405 self.HasAcquiredLock = False |
|
406 self.AccessLock.release() |
|
407 |
391 #------------------------------------------------------------------------------- |
408 #------------------------------------------------------------------------------- |
392 # Viewer Rubberband |
409 # Viewer Rubberband |
393 #------------------------------------------------------------------------------- |
410 #------------------------------------------------------------------------------- |
394 |
411 |
395 """ |
412 """ |