control-c fixes
This commit is contained in:
		@@ -31,11 +31,12 @@ class Task(object):
 | 
			
		||||
 | 
			
		||||
class Scheduler(object):
 | 
			
		||||
	"""Threaded scheduler that allows for updates mid-execution unlike http://docs.python.org/library/sched.html#module-sched"""
 | 
			
		||||
	def __init__(self):
 | 
			
		||||
	def __init__(self, parentqueue=None):
 | 
			
		||||
		self.addq = queue.Queue()
 | 
			
		||||
		self.schedule = []
 | 
			
		||||
		self.thread = None
 | 
			
		||||
		self.run = False
 | 
			
		||||
		self.parentqueue = parentqueue
 | 
			
		||||
	
 | 
			
		||||
	def process(self, threaded=True):
 | 
			
		||||
		if threaded:
 | 
			
		||||
@@ -47,29 +48,37 @@ class Scheduler(object):
 | 
			
		||||
	def _process(self):
 | 
			
		||||
		self.run = True
 | 
			
		||||
		while self.run:
 | 
			
		||||
			wait = 5
 | 
			
		||||
			updated = False
 | 
			
		||||
			if self.schedule:
 | 
			
		||||
				wait = self.schedule[0].next - time.time()
 | 
			
		||||
			try:
 | 
			
		||||
				newtask = self.addq.get(True, wait)
 | 
			
		||||
			except queue.Empty:
 | 
			
		||||
				cleanup = []
 | 
			
		||||
				for task in self.schedule:
 | 
			
		||||
					if time.time() >= task.next:
 | 
			
		||||
						updated = True
 | 
			
		||||
						if not task.run():
 | 
			
		||||
							cleanup.append(task)
 | 
			
		||||
				wait = 5
 | 
			
		||||
				updated = False
 | 
			
		||||
				if self.schedule:
 | 
			
		||||
					wait = self.schedule[0].next - time.time()
 | 
			
		||||
				try:
 | 
			
		||||
					if wait <= 0.0:
 | 
			
		||||
						newtask = self.addq.get(False)
 | 
			
		||||
					else:
 | 
			
		||||
						break
 | 
			
		||||
				for task in cleanup:
 | 
			
		||||
					x = self.schedule.pop(self.schedule.index(task))
 | 
			
		||||
			else:
 | 
			
		||||
				updated = True
 | 
			
		||||
				self.schedule.append(newtask)
 | 
			
		||||
			finally:
 | 
			
		||||
				if updated: self.schedule = sorted(self.schedule, key=lambda task: task.next)
 | 
			
		||||
						newtask = self.addq.get(True, wait)
 | 
			
		||||
				except queue.Empty:
 | 
			
		||||
					cleanup = []
 | 
			
		||||
					for task in self.schedule:
 | 
			
		||||
						if time.time() >= task.next:
 | 
			
		||||
							updated = True
 | 
			
		||||
							if not task.run():
 | 
			
		||||
								cleanup.append(task)
 | 
			
		||||
						else:
 | 
			
		||||
							break
 | 
			
		||||
					for task in cleanup:
 | 
			
		||||
						x = self.schedule.pop(self.schedule.index(task))
 | 
			
		||||
				else:
 | 
			
		||||
					updated = True
 | 
			
		||||
					self.schedule.append(newtask)
 | 
			
		||||
				finally:
 | 
			
		||||
					if updated: self.schedule = sorted(self.schedule, key=lambda task: task.next)
 | 
			
		||||
			except KeyboardInterrupt:
 | 
			
		||||
				self.run = False
 | 
			
		||||
		logging.debug("Qutting Scheduler thread")
 | 
			
		||||
		if self.parentqueue is not None:
 | 
			
		||||
			self.parentqueue.put(('quit', None, None))
 | 
			
		||||
 | 
			
		||||
	def add(self, name, seconds, callback, args=None, kwargs=None, repeat=False, qpointer=None):
 | 
			
		||||
		self.addq.put(Task(name, seconds, callback, args, kwargs, repeat, qpointer))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user