PyQt QThreadPool error

H

h0uk

Hello.

I have the following code:

#workers = {}
QtCore.QThreadPool.globalInstance().setExpiryTimeout
(300000)
QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)
for i in range(1, int(userscnt) + 1):
work = wk.Worker(i)
# connect signals
work.mmShowCaptcha.connect(self.show_captcha_dlg)
work.log.connect(self.handle_log)
self.captcha_answer.connect(work.mmCaptchaAnswer)
work.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(work)



On last line of code ( QtCore.QThreadPool.globalInstance().start
(work) ) i get an error:

SystemError: error return without exception set

What is wrong in my code??? Any advise???

Thanks
 
D

Diez B. Roggisch

h0uk said:
Hello.

I have the following code:

#workers = {}
QtCore.QThreadPool.globalInstance().setExpiryTimeout
(300000)
QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)
for i in range(1, int(userscnt) + 1):
work = wk.Worker(i)
# connect signals
work.mmShowCaptcha.connect(self.show_captcha_dlg)
work.log.connect(self.handle_log)
self.captcha_answer.connect(work.mmCaptchaAnswer)
work.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(work)



On last line of code ( QtCore.QThreadPool.globalInstance().start
(work) ) i get an error:

SystemError: error return without exception set

What is wrong in my code??? Any advise???


The error is on C-level. AFAIK it occurs when a Python-C-function
returns "NULL" without setting an exception.

It's hard to say where it really occurs. I'd use a debug-build of PyQt,
and possibly Python, and then investigate using gdb.

Alternatively, what happens when you do some "dummy"-work that doesn't
use signals and no other libraries?

Diez
 
H

h0uk

h0uk schrieb:









The error is on C-level. AFAIK it occurs when a Python-C-function
returns "NULL" without setting an exception.

It's hard to say where it really occurs. I'd use a debug-build of PyQt,
and possibly Python, and then investigate using gdb.

Alternatively, what happens when you do some "dummy"-work that doesn't
use signals and no other libraries?

Diez

About some "dummy" code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import time

from PyQt4 import QtCore, QtGui

class Job(QtCore.QRunnable):
def __init__(self, name):
QtCore.QRunnable.__init__(self)
self._name = name

def run(self):
time.sleep(10)
print self._name

def autoDelete(self):
return self._auto

def setAutoDelete(self, auto):
self._auto = auto



if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)

j = Job("Job-1")
j.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(j)


Even this code not work. On the last line of code
( QtCore.QThreadPool.globalInstance().start(j) ) i get the error:
 
D

Diez B. Roggisch

h0uk said:
About some "dummy" code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import time

from PyQt4 import QtCore, QtGui

class Job(QtCore.QRunnable):
def __init__(self, name):
QtCore.QRunnable.__init__(self)
self._name = name

def run(self):
time.sleep(10)
print self._name

def autoDelete(self):
return self._auto

def setAutoDelete(self, auto):
self._auto = auto



if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)

j = Job("Job-1")
j.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(j)


Even this code not work. On the last line of code
( QtCore.QThreadPool.globalInstance().start(j) ) i get the error:

Hm. I suggest you take this to the PyQt mailinglist. Phil Thompson is
very responsive.

Diez
 
H

h0uk

h0uk schrieb:

















Hm. I suggest you take this to the PyQt mailinglist. Phil Thompson is
very responsive.

Diez

Thanks you, Diez. Thanks for your time.
I already wrote to PyQt mailing list, but yet no get answer.

I will be waiting and try to write Phil Thompson.
 
P

Phil Thompson

About some "dummy" code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import time

from PyQt4 import QtCore, QtGui

class Job(QtCore.QRunnable):
def __init__(self, name):
QtCore.QRunnable.__init__(self)
self._name = name

def run(self):
time.sleep(10)
print self._name

def autoDelete(self):
return self._auto

def setAutoDelete(self, auto):
self._auto = auto



if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)

j = Job("Job-1")
j.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(j)


Even this code not work. On the last line of code
( QtCore.QThreadPool.globalInstance().start(j) ) i get the error:

You aren't letting the thread run before exiting the program. Try adding...

app.exec_()

....after you call start().

Also, I'm not sure what you are trying to achieve with your implementations
of autoDelete() and setAutoDelete().

Phil
 
H

h0uk

You aren't letting the thread run before exiting the program. Try adding....

    app.exec_()

...after you call start().

Also, I'm not sure what you are trying to achieve with your implementations
of autoDelete() and setAutoDelete().

Phil

Phil you right about app.exec_(). But situation is sligthly different.

I want to have more than one Job. I add these Jobs into QThreadPool
trough cycle. And I also want these Jobs to run sequentially.

The following code illustrate what I mean:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import time

from PyQt4 import QtCore, QtGui

class Job(QtCore.QRunnable):
def __init__(self, name):
QtCore.QRunnable.__init__(self)
self._name = name

def run(self):
time.sleep(3)
print self._name


if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)

for i in range(5):
j = Job("Job-" + str(i))
j.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(j, i)
app.exec_()

After 5 cycle I get the same error: An unhandled win32 exception
occured in python.exe.

How I can do it?? To run my Jobs sequentially???

Vardan.
 
P

Phil Thompson

....
Phil you right about app.exec_(). But situation is sligthly different.

I want to have more than one Job. I add these Jobs into QThreadPool
trough cycle. And I also want these Jobs to run sequentially.

The following code illustrate what I mean:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import time

from PyQt4 import QtCore, QtGui

class Job(QtCore.QRunnable):
def __init__(self, name):
QtCore.QRunnable.__init__(self)
self._name = name

def run(self):
time.sleep(3)
print self._name


if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

QtCore.QThreadPool.globalInstance().setMaxThreadCount(1)

for i in range(5):
j = Job("Job-" + str(i))
j.setAutoDelete(True)
QtCore.QThreadPool.globalInstance().start(j, i)
app.exec_()

After 5 cycle I get the same error: An unhandled win32 exception
occured in python.exe.

How I can do it?? To run my Jobs sequentially???

It's a PyQt bug. The workaround is not to use setAutoDelete() and instead
keep an explicit reference to your Job instances - for example in a list of
jobs.

Phil
 
H

h0uk

...

















It's a PyQt bug. The workaround is not to use setAutoDelete() and instead
keep an explicit reference to your Job instances - for example in a list of
jobs.

Phil

Thanks, Phil.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,023
Latest member
websitedesig25

Latest Threads

Top