[PyQt] thread in pyqt ... simple example needed
Hazen Babcock
hbabcock at mac.com
Sun Apr 5 23:04:16 BST 2009
Arnold Krille wrote:
> On Sunday 05 April 2009 21:29:44 Hazen Babcock wrote:
>> I'd suggest expanding your MyThread class to something like this:
>> class MyThread(QtCore.QThread):
>> def __init__(self, parent = None):
>> QtCore.QThread.__init__(self, parent)
>> self.running = 1
>> def run(self):
>> n = 0
>> step = 1
>> while self.running:
>> n += step
>> print n
>> self.msleep(100)
>> def stop(self):
>> self.running = 0
>> You should also look at the QtCore.QMutex() class, which provides a way
>> to synchronize (via locking) between the thread process and other
>> processes.
>
> Another reason while this will not work as expected is the Big Intepreter
> Lock. Unless QThread releases the BIL in its *sleep-functions, the thread will
> block the execution of the main-thread...
>
> Arnold
Yeah that wasn't such a good suggestion. I actually tested this one and
it works as expected for me:
import sys
from PyQt4 import QtCore, QtGui
import time
class MyThread(QtCore.QThread):
def __init__(self, parent = None):
QtCore.QThread.__init__(self, parent)
self.alive = 1
self.running = 0
self.n = 0
def run(self):
while self.alive:
step = 1
n = 0
while self.running:
n += step
print n
self.msleep(100)
self.msleep(100)
def toggle(self):
if self.running:
self.running = 0
else:
self.running = 1
def stop(self):
self.alive = 0
class Gui(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QGroupBox.__init__(self, parent)
self.gcenter = QtGui.QPushButton("X", self)
self.gcenter.setAutoRepeat(True)
guiLayout = QtGui.QGridLayout()
guiLayout.addWidget(self.gcenter,1,0)
self.setLayout(guiLayout)
self.thread = MyThread()
self.thread.start()
self.connect(self.gcenter, QtCore.SIGNAL("clicked()"),
self.thread.toggle)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
gui = Gui()
gui.show()
sys.exit(app.exec_())
I assume that QThread must be releasing the GIL while sleeping.
-Hazen
More information about the PyQt
mailing list