[PyQt] Freezes and crashes with signal autoconnection
Christian Roche
christian.roche.fr at gmail.com
Mon Oct 5 10:24:09 BST 2009
Hi there,
I'm having some problems with a fairly simple multi-threaded application
under PyQt 4.5.4 and Windows XP. I have a number of worker threads that feed
one consumer in the main GUI thread. Initially I had the worker threads
directly call the "add" method of the consumer object; this piece of code
was protected by a mutex. So in short:
class Worker(QThread):
def run(self):
...
cache.add(link)
class Cache():
def add(self, link):
mutex.lock()
# Add link to queue
mutex.unlock()
cache = Cache()
This works pretty well but still I'm not completely satisfied. It's bad to
execute code that doesn't belong to your thread, right? So I tried to
replace that with a signal/slot mechanism:
class Worker(QThread):
addLink = pyqtSignal(Link)
def init(self):
self.addLink.connect(cache.add)
def run(self):
...
link = Link(blah blah)
self.addLink.emit(link)
class Cache(QObject):
def add(self, link):
# Add link to queue
# No more mutex since access is now serial, right ?
...
However the application freezes after a while. No more GUI activity, window
not even repainting anymore and Windows tells me "this application is not
responding etc" when trying to close. This doesn't happen if I use
Qt.DirectConnection or Qt.BlockingQueuedConnection it seems, although I have
no idea why.
I also notice that with Qt.AutoConnection, the application crashes with no
error message unless I use 'PyQt_PyObject' types, with the quotes, in all
signal definitions (instead of Link for instance); I don't have this problem
either when using Qt.DirectConnection or Qt.BlockingQueuedConnection.
So does anyone understand what's going on here under the hood? Is the
signal/slot approach the correct way to garantee serial access to a shared
resource between threads (the link queue in this example)? Why is this whole
thing crashing and freezing like that?
Thanks for sharing your insight!
Chris
--
View this message in context: http://www.nabble.com/Freezes-and-crashes-with-signal-autoconnection-tp25716493p25716493.html
Sent from the PyQt mailing list archive at Nabble.com.
More information about the PyQt
mailing list