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 """
00040 Updates invalid caches.
00041 One thread per timeline.
00042 """
00043
00044 def __init__(self, timeline):
00045 threading.Thread.__init__(self)
00046 self.timeline = timeline
00047 self._stop_flag = False
00048 self.setDaemon(True)
00049 self.start()
00050
00051 def run(self):
00052 while not self._stop_flag:
00053 with self.timeline.index_cache_cv:
00054
00055 while len(self.timeline.invalidated_caches) == 0:
00056 self.timeline.index_cache_cv.wait()
00057 if self._stop_flag:
00058 return
00059
00060 total_topics = len(self.timeline.topics)
00061 update_step = max(1, total_topics / 100)
00062 topic_num = 1
00063 progress = 0
00064 updated = False
00065 for topic in self.timeline.topics:
00066 if topic in self.timeline.invalidated_caches:
00067 updated = (self.timeline._update_index_cache(topic) > 0)
00068 if topic_num % update_step == 0 or topic_num == total_topics:
00069 new_progress = int(100.0 * (float(topic_num) / total_topics))
00070 if new_progress != progress:
00071 progress = new_progress
00072 if not self._stop_flag:
00073 self.timeline.scene().background_progress = progress
00074 self.timeline.scene().status_bar_changed_signal.emit()
00075 topic_num += 1
00076
00077 if updated:
00078 self.timeline.scene().background_progress = 0
00079 self.timeline.scene().status_bar_changed_signal.emit()
00080 self.timeline.scene().update()
00081
00082 time.sleep(1.0)
00083
00084 def stop(self):
00085 self._stop_flag = True
00086 cv = self.timeline.index_cache_cv
00087 with cv:
00088 cv.notify()