From: Phil Thompson on 7 Jan 2010 17:02 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 7 Jan 2010 18:07 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 8 Jan 2010 06:27 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 8 Jan 2010 12:11 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.
First
|
Prev
|
Pages: 1 2 Prev: ANN: Pymazon 0.1.0 released! Next: Scripting (was Re: Python books, literature etc) |