#!/usr/bin/env python
import sys,os,re,getopt
from qt import *
import time

CHANGEDIR=QEvent.User+20

class Queue(QThread):
	def __init__(self):
		QThread.__init__(self)
		self.queue=[]
		self.mutex=QMutex()
		self.stop=False
		self.finished=True

	def enqueue(self,target,eventtype):
		self.mutex.lock()
		self.queue.append((target,eventtype))
		self.mutex.unlock()

	def run(self):
		sleepTime=50
		while True:
			if self.finished:
				if self.stop :
					return
				self.mutex.lock()
				if len(self.queue)>0 :
					self.finished=False
					e=self.queue.pop(0)
					self.mutex.unlock()
					print "posting event"
					QApplication.postEvent(e[0],QCustomEvent(e[1]))
					#QApplication.sendPostedEvents()
				else:
					self.mutex.unlock()
					self.msleep(sleepTime)
			else: 
				self.msleep(sleepTime)

	def finishedJob(self):
		""" used by external jobs to signal they have
		finished their job
		"""
		self.mutex.lock()
		self.finished=True
		self.mutex.unlock()

	def end(self):
		""" stop the thread, it may take few seconds
		depending what job is running
		"""
		self.mutex.lock()
		self.stop=True
		self.mutex.unlock()

class XV(QMainWindow):
	def __init__(self,parent,*args):
		QMainWindow.__init__(self,*args)
		MainWidget=QWidget(self)
		self.setCentralWidget(MainWidget)

		self.parent=parent
		self.label=QLabel(MainWidget)
		self.label.setText("No event so far")
		self.enqueue()
		self.count=0

	def enqueue(self):
		for i in range(1,100):
			queue.enqueue(self,CHANGEDIR)

	def customEvent(self,ev):
		if ev.type()==CHANGEDIR:
			self.label.setText("event " + str(self.count))
			self.count=self.count+1
			print "event"
			time.sleep(0.5)
			print "finished sleep"
			queue.finishedJob()

queue=Queue()
app=QApplication(sys.argv[1:])
xv=XV(app)
app.setMainWidget(xv)
queue.start()
xv.show()
app.exec_loop()

queue.end() 
queue.finishedJob()
queue.wait()
