BeremizIDE.py
changeset 2728 10d8ca7a3d31
parent 2726 c465414017a2
child 2730 ce21ce181fdb
equal deleted inserted replaced
2727:6330e6bb345d 2728:10d8ca7a3d31
   120         self.black_white = wx.stc.STC_STYLE_DEFAULT
   120         self.black_white = wx.stc.STC_STYLE_DEFAULT
   121         self.output = output
   121         self.output = output
   122         self.risecall = risecall
   122         self.risecall = risecall
   123         # to prevent rapid fire on rising log panel
   123         # to prevent rapid fire on rising log panel
   124         self.rising_timer = 0
   124         self.rising_timer = 0
   125         self.lock = Lock()
   125         self.StackLock = Lock()
   126         self.YieldLock = Lock()
   126         self.YieldLock = Lock()
   127         self.RefreshLock = Lock()
   127         self.RefreshLock = Lock()
   128         self.TimerAccessLock = Lock()
   128         self.TimerAccessLock = Lock()
   129         self.stack = []
   129         self.stack = []
   130         self.LastRefreshTime = gettime()
   130         self.LastRefreshTime = gettime()
   131         self.LastRefreshTimer = None
   131         self.LastRefreshTimer = None
   132 
   132 
   133     def write(self, s, style=None):
   133     def write(self, s, style=None):
   134         if self.lock.acquire():
   134         self.StackLock.acquire()
   135             self.stack.append((s, style))
   135         self.stack.append((s, style))
   136             self.lock.release()
   136         self.StackLock.release()
   137             current_time = gettime()
   137         current_time = gettime()
       
   138         with self.TimerAccessLock:
       
   139             if self.LastRefreshTimer is not None:
       
   140                 self.LastRefreshTimer.cancel()
       
   141                 self.LastRefreshTimer = None
       
   142         elapsed = current_time - self.LastRefreshTime
       
   143         if elapsed > REFRESH_PERIOD:
       
   144             self._should_write()
       
   145         else:
   138             with self.TimerAccessLock:
   146             with self.TimerAccessLock:
   139                 if self.LastRefreshTimer is not None:
   147                 if self.LastRefreshTimer is None:
   140                     self.LastRefreshTimer.cancel()
   148                     self.LastRefreshTimer = Timer(REFRESH_PERIOD - elapsed, self._timer_expired)
   141                     self.LastRefreshTimer = None
   149                     self.LastRefreshTimer.start()
   142             elapsed = current_time - self.LastRefreshTime
       
   143             if elapsed > REFRESH_PERIOD:
       
   144                 self._should_write()
       
   145             else:
       
   146                 with self.TimerAccessLock:
       
   147                     if self.LastRefreshTimer is None:
       
   148                         self.LastRefreshTimer = Timer(REFRESH_PERIOD - elapsed, self._timer_expired)
       
   149                         self.LastRefreshTimer.start()
       
   150 
   150 
   151     def _timer_expired(self):
   151     def _timer_expired(self):
   152         self._should_write()
   152         self._should_write()
   153         with self.TimerAccessLock:
   153         with self.TimerAccessLock:
   154             self.LastRefreshTimer = None
   154             self.LastRefreshTimer = None
   169 
   169 
   170     def _write(self):
   170     def _write(self):
   171         if self.output:
   171         if self.output:
   172             with self.RefreshLock:
   172             with self.RefreshLock:
   173                 self.output.Freeze()
   173                 self.output.Freeze()
   174                 self.lock.acquire()
   174                 self.output.AnnotationClearAll()
       
   175                 self.StackLock.acquire()
   175                 for s, style in self.stack:
   176                 for s, style in self.stack:
   176                     if style is None:
   177                     if style is None:
   177                         style = self.black_white
   178                         style = self.black_white
   178                     if style != self.black_white:
   179                     if style != self.black_white:
   179                         self.output.StartStyling(self.output.GetLength(), 0xff)
   180                         self.output.StartStyling(self.output.GetLength(), 0xff)
   189                     text_len = self.output.GetLength() - start_pos
   190                     text_len = self.output.GetLength() - start_pos
   190 
   191 
   191                     if style != self.black_white:
   192                     if style != self.black_white:
   192                         self.output.SetStyling(text_len, style)
   193                         self.output.SetStyling(text_len, style)
   193                 self.stack = []
   194                 self.stack = []
   194                 self.lock.release()
   195                 self.StackLock.release()
   195                 self.output.Thaw()
   196                 self.output.Thaw()
   196                 self.LastRefreshTime = gettime()
   197                 self.LastRefreshTime = gettime()
   197                 newtime = time.time()
   198                 newtime = time.time()
   198                 if newtime - self.rising_timer > 1:
   199                 if newtime - self.rising_timer > 1:
   199                     self.risecall(self.output)
   200                     self.risecall(self.output)