Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 import threading
00034 import time
00035
00036
00037 class IndexCacheThread(threading.Thread):
00038 """
00039 Updates invalid caches.
00040 One thread per timeline.
00041 """
00042 def __init__(self, timeline):
00043 threading.Thread.__init__(self)
00044 self.timeline = timeline
00045 self._stop_flag = False
00046 self.setDaemon(True)
00047 self.start()
00048
00049 def run(self):
00050 while not self._stop_flag:
00051 with self.timeline.index_cache_cv:
00052
00053 while len(self.timeline.invalidated_caches) == 0:
00054 self.timeline.index_cache_cv.wait()
00055 if self._stop_flag:
00056 return
00057
00058 total_topics = len(self.timeline.topics)
00059 update_step = max(1, total_topics / 100)
00060 topic_num = 1
00061 progress = 0
00062 updated = False
00063 for topic in self.timeline.topics:
00064 if topic in self.timeline.invalidated_caches:
00065 updated = (self.timeline._update_index_cache(topic) > 0)
00066 if topic_num % update_step == 0 or topic_num == total_topics:
00067 new_progress = int(100.0 * (float(topic_num) / total_topics))
00068 if new_progress != progress:
00069 progress = new_progress
00070 if not self._stop_flag:
00071 self.timeline.scene().background_progress = progress
00072 self.timeline.scene().status_bar_changed_signal.emit()
00073 topic_num += 1
00074
00075 if updated:
00076 self.timeline.scene().background_progress = 0
00077 self.timeline.scene().status_bar_changed_signal.emit()
00078 self.timeline.scene().update()
00079
00080 time.sleep(1.0)
00081
00082 def stop(self):
00083 self._stop_flag = True
00084 cv = self.timeline.index_cache_cv
00085 with cv:
00086 cv.notify()