[Tutor] Threading in a for loop

Bill Burns billburns at pennswoods.net
Tue Sep 20 22:06:06 CEST 2005


I've got a few questions regarding Threading. I've never used threads
before and I want to make sure I'm doing it correctly ;-)

I have a GUI app and it processes Tiff files to PDF (or PostScript). The
GUI has a ListBox which the user populates with files to convert. You
click on a Button and the file conversion starts. When all the files
have been converted, the ListBox items (the files) are cleared.

Initially, you had no way of knowing what was going on until all the
files where cleared from the ListBox.

So I thought of creating threads in the 'for loop' and displaying the
name of each file in the statusBar of the GUI (as they are being
processed).

Here's my method which takes the files in the ListBox and sends them off
to my Convert() class (self.convert = Convert()).
<code>
def convertTiff2PDF(self):
     from time import time
     #Let's see how long this takes... I saw Kent do this on the
     #Python Tutor list before :-)
     start = time()
     #Grab a tuple which contains width & length
     sizes = self.getPaperSize()
     width = sizes[0]
     length = sizes[1]
     #Count the number of files in the ListBox
     fileCount = self.fileListBox.count()
     for index in range(fileCount):
         #Get each filename
         filenames = str(self.fileListBox.text(index))
         #Setup the worker thread and send the filenames in
         worker = WorkerThread(self, filenames)
         #Start threading
         worker.start()
         #Send each file to be converted
         self.convert.tiff2pdf(width, length, filenames)
     #We're done, so clear the ListBox
     self.fileListBox.clear()
     #Check the time again
     end = time()
     msg = '%s Files Processed in %0.3f Seconds.' % (fileCount,
(end-start))
     #Grab the statusBar and insert the message
     statusBar = self.statusBar()
     statusBar.message(msg, 0)
</code>

And here's what I'm doing in my Thread class:
<code>
class WorkerThread(Thread):
     """Thread class."""
     def __init__(self, parent, files):
         Thread.__init__(self)
         self.parent = parent
         self.files = files

     def run(self):
         statusBar = self.parent.statusBar()
         msg = 'Processing: %s, please wait.' % (self.files)
         statusBar.message(msg, 100)
         time.sleep(1)
</code>

Am I doing this threading properly? Is it 'OK' to start multiple threads
like this (in the for loop)? It's possible that a user could put 'many'
files into the ListBox, by 'many' I mean 100-200 files.

Thanks for your help.

Bill




More information about the Tutor mailing list