306 self.DataConsumers = {} |
306 self.DataConsumers = {} |
307 |
307 |
308 self.LastRefreshTime = gettime() |
308 self.LastRefreshTime = gettime() |
309 self.HasAcquiredLock = False |
309 self.HasAcquiredLock = False |
310 self.AccessLock = Lock() |
310 self.AccessLock = Lock() |
|
311 self.TimerAccessLock = Lock() |
311 |
312 |
312 self.LastRefreshTimer = None |
313 self.LastRefreshTimer = None |
313 |
314 |
314 self.SetDataProducer(producer) |
315 self.SetDataProducer(producer) |
315 |
316 |
316 def __del__(self): |
317 def __del__(self): |
317 self.DataProducer = None |
318 self.DataProducer = None |
318 self.DeleteDataConsumers() |
319 self.DeleteDataConsumers() |
319 self.RefreshTimer.Stop() |
320 if self.LastRefreshTimer is not None: |
|
321 self.LastRefreshTimer.Stop() |
320 |
322 |
321 def SetDataProducer(self, producer): |
323 def SetDataProducer(self, producer): |
322 if self.RegisterTick and self.Debug: |
324 if self.RegisterTick and self.Debug: |
323 if producer is not None: |
325 if producer is not None: |
324 producer.SubscribeDebugIECVariable("__tick__", self) |
326 producer.SubscribeDebugIECVariable("__tick__", self) |
372 self.AccessLock.acquire() |
374 self.AccessLock.acquire() |
373 self.HasAcquiredLock = True |
375 self.HasAcquiredLock = True |
374 self.AccessLock.release() |
376 self.AccessLock.release() |
375 self.RefreshNewData() |
377 self.RefreshNewData() |
376 else: |
378 else: |
|
379 self.TimerAccessLock.acquire() |
377 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) |
380 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) |
378 self.LastRefreshTimer.start() |
381 self.LastRefreshTimer.start() |
|
382 self.TimerAccessLock.release() |
379 |
383 |
380 def NewDataAvailable(self, *args, **kwargs): |
384 def NewDataAvailable(self, *args, **kwargs): |
|
385 self.TimerAccessLock.acquire() |
381 if self.LastRefreshTimer is not None: |
386 if self.LastRefreshTimer is not None: |
382 self.LastRefreshTimer.cancel() |
387 self.LastRefreshTimer.cancel() |
383 self.LastRefreshTimer=None |
388 self.LastRefreshTimer=None |
|
389 self.TimerAccessLock.release() |
384 if not self.Inhibited: |
390 if not self.Inhibited: |
385 current_time = gettime() |
391 current_time = gettime() |
386 if current_time - self.LastRefreshTime > REFRESH_PERIOD and DEBUG_REFRESH_LOCK.acquire(False): |
392 if current_time - self.LastRefreshTime > REFRESH_PERIOD and DEBUG_REFRESH_LOCK.acquire(False): |
387 self.AccessLock.acquire() |
393 self.AccessLock.acquire() |
388 self.HasAcquiredLock = True |
394 self.HasAcquiredLock = True |
389 self.AccessLock.release() |
395 self.AccessLock.release() |
390 self.LastRefreshTime = gettime() |
396 self.LastRefreshTime = gettime() |
391 self.Inhibit(True) |
397 self.Inhibit(True) |
392 wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs) |
398 wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs) |
|
399 elif not self.IsShown() and self.HasAcquiredLock: |
|
400 DebugViewer.RefreshNewData(self) |
393 |
401 |
394 def RefreshViewOnNewData(self, *args, **kwargs): |
402 def RefreshViewOnNewData(self, *args, **kwargs): |
395 if self: |
403 if self: |
396 self.RefreshNewData(*args, **kwargs) |
404 self.RefreshNewData(*args, **kwargs) |
|
405 self.TimerAccessLock.acquire() |
397 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) |
406 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh) |
398 self.LastRefreshTimer.start() |
407 self.LastRefreshTimer.start() |
|
408 self.TimerAccessLock.release() |
399 |
409 |
400 def RefreshNewData(self, *args, **kwargs): |
410 def RefreshNewData(self, *args, **kwargs): |
401 self.Inhibit(False) |
411 self.Inhibit(False) |
402 self.AccessLock.acquire() |
412 self.AccessLock.acquire() |
403 if self.HasAcquiredLock: |
413 if self.HasAcquiredLock: |