469,338 Members | 7,976 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,338 developers. It's quick & easy.

PyQt: Is signal / slot really working across threads?

Hello pyqt users,

i tried to use signal / slot across threads. With the following example I want
to emit a signal when the thread loop is entered. The connected slot is never
called. Why?

Any help is very welcome ...

Alexander

import time
import sys
import PyQt4
from PyQt4.QtCore import (QObject, QThread)
SIGNAL = PyQt4.QtCore.SIGNAL

class CancelableQtThread_(QThread):

def __init__(self):
QThread.__init__(self)
self.sigStarted = SIGNAL("sigStarted()")

def run(self):
print "Enter thread"
self.emit(self.sigStarted)
time.sleep(0.1)
print "Leave thread"

class TestSigSlot(QObject):

def __init__(self):
QObject.__init__(self)
self._thread = CancelableQtThread_()
self.connect(self._thread, self._thread.sigStarted, self.Called)
self._thread.start()

time.sleep(1.0)

def Called(self):
print "Called !"

if __name__ == "__main__":
obj = TestSigSlot()
May 29 '07 #1
2 3448
On Tuesday 29 May 2007 11:58 am, Alexander Eisenhuth wrote:
Hello pyqt users,

i tried to use signal / slot across threads. With the following example I
want to emit a signal when the thread loop is entered. The connected slot
is never called. Why?

Any help is very welcome ...

Alexander

import time
import sys
import PyQt4
from PyQt4.QtCore import (QObject, QThread)
SIGNAL = PyQt4.QtCore.SIGNAL

class CancelableQtThread_(QThread):

def __init__(self):
QThread.__init__(self)
self.sigStarted = SIGNAL("sigStarted()")

def run(self):
print "Enter thread"
self.emit(self.sigStarted)
time.sleep(0.1)
print "Leave thread"

class TestSigSlot(QObject):

def __init__(self):
QObject.__init__(self)
self._thread = CancelableQtThread_()
self.connect(self._thread, self._thread.sigStarted, self.Called)
self._thread.start()

time.sleep(1.0)

def Called(self):
print "Called !"

if __name__ == "__main__":
obj = TestSigSlot()
Signals across threads are implemented using the event loop. You don't have an
event loop running in your main thread - you don't even have a
QCoreApplication instance.

Phil
May 29 '07 #2
Ok, thanks.

Phil Thompson schrieb:
On Tuesday 29 May 2007 11:58 am, Alexander Eisenhuth wrote:
>Hello pyqt users,

i tried to use signal / slot across threads. With the following example I
want to emit a signal when the thread loop is entered. The connected slot
is never called. Why?

Any help is very welcome ...

Alexander

import time
import sys
import PyQt4
from PyQt4.QtCore import (QObject, QThread)
SIGNAL = PyQt4.QtCore.SIGNAL

class CancelableQtThread_(QThread):

def __init__(self):
QThread.__init__(self)
self.sigStarted = SIGNAL("sigStarted()")

def run(self):
print "Enter thread"
self.emit(self.sigStarted)
time.sleep(0.1)
print "Leave thread"

class TestSigSlot(QObject):

def __init__(self):
QObject.__init__(self)
self._thread = CancelableQtThread_()
self.connect(self._thread, self._thread.sigStarted, self.Called)
self._thread.start()

time.sleep(1.0)

def Called(self):
print "Called !"

if __name__ == "__main__":
obj = TestSigSlot()

Signals across threads are implemented using the event loop. You don't have an
event loop running in your main thread - you don't even have a
QCoreApplication instance.

Phil
May 29 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.

By using this site, you agree to our Privacy Policy and Terms of Use.