194 # to prevent rapid fire on rising log panel |
194 # to prevent rapid fire on rising log panel |
195 self.rising_timer = 0 |
195 self.rising_timer = 0 |
196 self.lock = Lock() |
196 self.lock = Lock() |
197 self.YieldLock = Lock() |
197 self.YieldLock = Lock() |
198 self.RefreshLock = Lock() |
198 self.RefreshLock = Lock() |
|
199 self.TimerAccessLock = Lock() |
199 self.stack = [] |
200 self.stack = [] |
200 self.LastRefreshTime = gettime() |
201 self.LastRefreshTime = gettime() |
201 self.LastRefreshTimer = None |
202 self.LastRefreshTimer = None |
202 |
203 |
203 def write(self, s, style = None): |
204 def write(self, s, style = None): |
204 if self.lock.acquire(): |
205 if self.lock.acquire(): |
205 self.stack.append((s,style)) |
206 self.stack.append((s,style)) |
206 self.lock.release() |
207 self.lock.release() |
207 current_time = gettime() |
208 current_time = gettime() |
|
209 self.TimerAccessLock.acquire() |
208 if self.LastRefreshTimer: |
210 if self.LastRefreshTimer: |
209 self.LastRefreshTimer.cancel() |
211 self.LastRefreshTimer.cancel() |
210 self.LastRefreshTimer=None |
212 self.LastRefreshTimer=None |
|
213 self.TimerAccessLock.release() |
211 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
214 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
212 self._should_write() |
215 self._should_write() |
213 else: |
216 else: |
|
217 self.TimerAccessLock.acquire() |
214 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) |
218 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) |
215 self.LastRefreshTimer.start() |
219 self.LastRefreshTimer.start() |
|
220 self.TimerAccessLock.release() |
216 |
221 |
217 def _timer_expired(self): |
222 def _timer_expired(self): |
218 if self.RefreshLock.acquire(False): |
223 if self.RefreshLock.acquire(False): |
219 self._should_write() |
224 self._should_write() |
220 else: |
225 else: |
|
226 self.TimerAccessLock.acquire() |
221 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) |
227 self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) |
222 self.LastRefreshTimer.start() |
228 self.LastRefreshTimer.start() |
|
229 self.TimerAccessLock.release() |
223 |
230 |
224 def _should_write(self): |
231 def _should_write(self): |
225 wx.CallAfter(self._write) |
232 wx.CallAfter(self._write) |
226 if MainThread == currentThread().ident: |
233 if MainThread == currentThread().ident: |
227 app = wx.GetApp() |
234 app = wx.GetApp() |