El Monday 08 December 2008 03:53:28 vàreu escriure:
> On Mon, Dec 8, 2008 at 12:53 AM, Sergio Jovani <[EMAIL PROTECTED]> wrote:
> > Hi all,
> >
> > I'm developing a downloads application and I have created a QThread for
> > that reason. I start the QThread with no problems, but when I try
> > terminate it clicking on cancel pushbutton, I can't, application freezes.
> > Thanks in advance. Here the code:
> >
> > ---
> >
> > class MainWindow(QMainWindow):
> >        def __init__(self, parent = None):
> >                QMainWindow.__init__(self, parent)
> >                ...
> >                self.pbCancel=QPushButton(self.tr("Cancel"))
> >                self.connect(self.pbCancel, SIGNAL("clicked()"),
> > self.cancel) ...
> >        def download(self):
> >                ...
> >                self.threadDownload = Download(url, path, filename)
> >                self.threadDownload.start()
> >
> >        def cancel(self):
> >                self.threadDownload.terminate()
> >                self.threadDownload.wait()
> >
> > class Download(QThread):
> >        def __init__(self, url, path, filename, parent = None):
> >                QThread.__init__(self, parent)
> >                self.path=path
> >                self.url=url
> >                self.filename=filename
> >
> >        def run(self):
> >                os.chdir(self.path)
> >               
> > urllib.urlretrieve(self.url,self.filename,reporthook=self.myreporthook)


Dears subcribers,

A few days ago, I received a lot of help trying solve this problem. Thanks for 
that.

After testing and writing and erasing code, I discovered the main problem of 
this. QThread is powerful but also dangerous, it have to terminate in a safe 
way, if not, program will become unstable.

The main problem was the urllib2 function, because if a file is opened inside 
thread, file wll have to be closed inside thread in order to terminate properly 
the thread.

I hope this helps someone. I wrote a piece of code replacing 
urlllib.urlretrieve function. and doing this I can close opened file before to 
terminate thread.

---

class MainWindow(QMainWindow):
        def __init__(self, parent = None):
                QMainWindow.__init__(self, parent)
                ...
                self.pbCancel=QPushButton(self.tr("Cancel"))
                self.connect(self.pbCancel, SIGNAL("clicked()"), self.cancel)   
                ...
        def download(self):
                ...
                self.threadDownload = Download(url, path, filename)
                self.threadDownload.start()

        def cancel(self):
                self.threadDownload.interrupt() # Not terminate() !
                self.threadDownload.wait()

class Download(QThread):
        def __init__(self, url, path, filename, parent = None):
                QThread.__init__(self, parent)
                self.path=path
                self.url=url
                self.filename=filename
                self.interrupted = False # We will have to change this to 
terminate thread!

        def interrupt(self):
                self.interrupted = True

        def run(self):
                os.chdir(self.path)
                block_size = 4096
                i = 0
                counter = 0
                temp = urllib2.urlopen(self.url)
                headers = temp.info()
                size = int(headers['Content-Length'])
                data = open(self.filename, 'wb')
                while i < size:
                        if not self.interrupted:
                                data.write(temp.read(block_size))
                                i += block_size
                                counter += 1
                                self.myreporthook(counter, block_size, size) # 
you can use reporthook!
                        else:
                                break                                   
                data.close()
                temp.close()
                
                self.quit() # terminate() too dangerous, now we can use quit() 
or exit(int).

---

Thanks! See you!


_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to