From: Phil Thompson on
On Thu, 7 Jan 2010 13:03:24 -0800 (PST), h0uk <vardan.pogosyan(a)gmail.com>
wrote:
> On 8 янв, 01:02, "Diez B. Roggisch" <de...(a)nospam.web.de> wrote:
>> h0uk schrieb:
>>
>>
>>
>> > 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
>
> 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:
>
>>> An unhandled win32 exception occured in python.exe

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
From: h0uk on
On 8 янв, 03:02, Phil Thompson <p...(a)riverbankcomputing.com> wrote:
> On Thu, 7 Jan 2010 13:03:24 -0800 (PST), h0uk <vardan.pogos...(a)gmail.com>
> wrote:
>
> > On 8 янв, 01:02, "Diez B. Roggisch" <de...(a)nospam.web.de> wrote:
> >> h0uk schrieb:
>
> >> > 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
>
> > 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:
>
> >>> An unhandled win32 exception occured in python.exe
>
> 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.
From: Phil Thompson on
On Thu, 7 Jan 2010 15:07:10 -0800 (PST), h0uk <vardan.pogosyan(a)gmail.com>
wrote:

....

> 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
From: h0uk on
On 8 янв, 16:27, Phil Thompson <p...(a)riverbankcomputing.com> wrote:
> On Thu, 7 Jan 2010 15:07:10 -0800 (PST), h0uk <vardan.pogos...(a)gmail.com>
> wrote:
>
> ...
>
>
>
> > 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

Thanks, Phil.