summaryrefslogtreecommitdiffstats
path: root/examples/semaphore.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/semaphore.py')
-rwxr-xr-xexamples/semaphore.py203
1 files changed, 203 insertions, 0 deletions
diff --git a/examples/semaphore.py b/examples/semaphore.py
new file mode 100755
index 0000000..79affb2
--- /dev/null
+++ b/examples/semaphore.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+#
+# A port of the semaphore example from TQt.
+
+
+import sys
+
+# Check if thread support was enabled.
+try:
+ from python_tqt.qt import TQThread
+except:
+ print("Thread support not enabled")
+ sys.exit(1)
+
+from python_tqt.qt import *
+
+
+# The semaphore instances.
+yellowSem = None
+greenSem = None
+
+
+class YellowThread(TQThread):
+ def __init__(self,o):
+ TQThread.__init__(self)
+
+ self.receiver = o
+ self.stopped = 0
+ self.mutex = TQMutex()
+
+ def run(self):
+ global yellowSem, greenSem
+
+ for i in range(20):
+ yellowSem += 1
+
+ event = TQCustomEvent(12345)
+ event.setData(TQString("Yellow!"))
+ TQThread.postEvent(self.receiver,event)
+ self.msleep(200);
+
+ greenSem -= 1
+
+ self.mutex.lock()
+ if self.stopped:
+ self.stopped = 0
+ self.mutex.unlock()
+ break
+
+ self.mutex.unlock()
+
+ yellowSem += 1
+
+ event = TQCustomEvent(12346)
+ event.setData(TQString("Yellow!"))
+ TQThread.postEvent(self.receiver,event)
+
+ greenSem -= 1
+
+ def stop(self):
+ self.mutex.lock()
+ self.stopped = 1
+ self.mutex.unlock()
+
+
+class GreenThread(TQThread):
+ def __init__(self,o):
+ TQThread.__init__(self)
+
+ self.receiver = o
+ self.stopped = 0
+ self.mutex = TQMutex()
+
+ def run(self):
+ global yellowSem, greenSem
+
+ for i in range(20):
+ greenSem += 1
+
+ event = TQCustomEvent(12345)
+ event.setData(TQString("Green!"))
+ TQThread.postEvent(self.receiver,event)
+ self.msleep(200)
+
+ yellowSem -= 1
+
+ self.mutex.lock()
+ if self.stopped:
+ self.stopped = 0
+ self.mutex.unlock()
+ break
+
+ self.mutex.unlock()
+
+ greenSem += 1
+
+ event = TQCustomEvent(12346)
+ event.setData(TQString("Green!"))
+ TQThread.postEvent(self.receiver,event)
+ self.msleep(10)
+
+ yellowSem -= 1
+
+ def stop(self):
+ self.mutex.lock()
+ self.stopped = 1
+ self.mutex.unlock()
+
+
+class SemaphoreExample(TQWidget):
+ def __init__(self):
+ TQWidget.__init__(self)
+
+ self.yellowThread = YellowThread(self)
+ self.greenThread = GreenThread(self)
+
+ global yellowSem, greenSem
+ yellowSem = TQSemaphore(1)
+ greenSem = TQSemaphore(1)
+
+ self.button = TQPushButton("&Ignition!",self)
+ self.connect(self.button,SIGNAL("clicked()"),self.startExample)
+
+ self.mlineedit = TQMultiLineEdit(self)
+ self.label = TQLabel(self)
+
+ vbox = TQVBoxLayout(self,5)
+ vbox.addWidget(self.button)
+ vbox.addWidget(self.mlineedit)
+ vbox.addWidget(self.label)
+
+ def __del__(self):
+ stopYellow = self.yellowThread.running()
+ stopGreen = self.greenThread.running()
+
+ if stopYellow:
+ self.yellowThread.stop()
+
+ if self.greenThread.running():
+ self.greenThread.stop()
+
+ if stopYellow:
+ self.yellowThread.wait()
+
+ if stopGreen:
+ self.greenThread.wait()
+
+ global yellowSem, greenSem
+ yellowSem = None
+ greenSem = None
+
+ def startExample(self):
+ if self.yellowThread.running() or self.greenThread.running():
+ TQMessageBox.information(self,"Sorry",
+ "The threads have not completed yet, and must finish before "
+ "they can be started again.")
+
+ return
+
+ self.mlineedit.clear()
+
+ global yellowSem
+
+ while yellowSem.available() < yellowSem.total():
+ yellowSem -= 1
+
+ yellowSem += 1
+
+ self.yellowThread.start()
+ self.greenThread.start()
+
+ def customEvent(self,event):
+ if event.type() == 12345:
+ s = event.data()
+
+ self.mlineedit.append(s)
+
+ if s.latin1() == "Green!":
+ self.label.setEraseColor(TQt.green)
+ else:
+ self.label.setEraseColor(TQt.yellow)
+
+ self.label.setText(s)
+
+ del s
+ elif event.type() == 12346:
+ s = event.data()
+
+ TQMessageBox.information(self,s.latin1() + " - Finished",
+ "The thread creating the \"" + s.latin1() +
+ "\" events has finished.")
+
+ del s
+ else:
+ print("Unknown custom event type:", event.type())
+
+
+app = TQApplication(sys.argv)
+se = SemaphoreExample()
+app.setMainWidget(se)
+se.show()
+
+sys.exit(app.exec_loop())