[PySide] QThread crash before emitting finished signal

William Dias william.dias at gmail.com
Thu Jun 7 21:00:20 CEST 2012


Thank you, Sebastian. I followed the procedures described in the document
and it worked. But I have another question.
Take a look at the code bellow:

class PhotoWorker(QObject):

photoStatus = Signal(str, str)

@Slot()
def work(self):
self.db = sqlite_database.SQLiteDatabase("db1")
self.timer = QTimer()
self.timer.timeout.connect(self.__resendPhoto)
logger.info("photo worker started")
self.timer.start(10000)

@Slot()
def __resendPhoto(self):
data = self.db.selectPhoto()
if data != None:
self.filename = data[0]
self.tags = data[1]
logger.info("trying to resend photo " + self.filename)
status = sendPhoto(self.tags, self.filename)
self.photoStatus.emit(self.filename, status)

And in a GUI class, I do the following:

photoWorker = http_connection.PhotoWorker(self)
photoWorker.photoStatus.connect(self.photoStatus)
photoThread = QThread()
photoWorker.moveToThread(photoThread)
photoThread.start()
QMetaObject.invokeMethod(photoWorker, "work", Qt.QueuedConnection)

I realized that when I create the photoWorker object, if I don't set its
parent to self, my thread dies. Is this because my photoWorker doesn't have
its own event loop? I am bit confused here. How should I proceed?

Thank you.

2012/6/7 Sebastian Elner <sebastian at risefx.com>

>  Although it is in the documentation, QThread is not meant to be used this
> way (subclassing). Have a look at this:
> http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ It helped me a
> lot. Also a complete stripped down example would greatly help in a case of
> a segfault.
>
>
>
> On 06/07/2012 09:59 AM, William Dias wrote:
>
> Hi,
>
>  I have a subclass of QThread which uploads pictures to a webserver. For
> each new picture created in the main thread, the program spawns a new
> thread to handle the job. I've override the __init__ method to be able to
> pass some parameters to the thread object, as you can see bellow.
>
>  class PhotoConnection(QThread):
>>  photoStatus = Signal(str, str)
>
>  def __init__(self, tags, filename, parent=None):
>>  QThread.__init__(self, parent)
>>  self.tags = tags
>>  self.filename = filename
>
>  def run(self):
>>  status = sendPhoto(self.tags, self.filename)
>>  self.photoStatus.emit(self.filename, status)
>
>
>  In the GUI thread, the method responsible dor creating the threads is
> the following:
>
>  def sendPhoto(self):
>>  photoConnection = PhotoConnection(self.tags_to_string, self.filename,
>> self)
>>  photoConnection.photoStatus.connect(self.photoStatus)
>>  photoConnection.finished.connect(self.threadFinished)
>>  photoConnection.start()
>>
>
>  In the PhotoConnection, if I don't set the parent of my Qthread object
> to self (for example, if I set to None) or if I don't override the __init__
> method and create another method to pass the arguments, when the thread
> finishes the execution I got a segfault.
> Why is this happening? Can you help me?
>
>  Thanks,
>
>
> _______________________________________________
> PySide mailing listPySide at qt-project.orghttp://lists.qt-project.org/mailman/listinfo/pyside
>
>
>
> --
> Sebastian Elsner    -    pipeline td   -   r i s e |  fx
>
> t:  +49 30 20180300                 sebastian at risefx.com
>                                           www.risefx.com
>
> r i s e |  fx  GmbH
> Schlesische Strasse 28 Aufgang B, 10997 Berlin
> Geschäftsführer: Sven Pannicke, Robert Pinnow
>
> Handelsregister Berlin HRB 106667 B
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
>
>


-- 
William Marques Dias
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20120607/07ebd3c7/attachment.html>


More information about the PySide mailing list