I have an FTP function that traces the progress of running upload but my understanding of threading is limited and i have been unable to implement a working solution… I’d like to add a GUI progress bar to my current Application by using threading. Can someone show me a basic function using asynchronous threads that can be updated from another running thread?
def ftpUploader():
BLOCKSIZE = 57344 # size 56 kB
ftp = ftplib.FTP()
ftp.connect(host)
ftp.login(login, passwd)
ftp.voidcmd("TYPE I")
f = open(zipname, 'rb')
datasock, esize = ftp.ntransfercmd(
'STOR %s' % os.path.basename(zipname))
size = os.stat(zipname)[6]
bytes_so_far = 0
print 'started'
while 1:
buf = f.read(BLOCKSIZE)
if not buf:
break
datasock.sendall(buf)
bytes_so_far += len(buf)
print "\rSent %d of %d bytes %.1f%%\r" % (
bytes_so_far, size, 100 * bytes_so_far / size)
sys.stdout.flush()
datasock.close()
f.close()
ftp.voidresp()
ftp.quit()
print 'Complete...'
Here’s a quick overview of threading, just in case 🙂 I won’t go into too much detail into the GUI stuff, other than to say that you should check out wxWidgets. Whenever you do something that takes a long time, like:
You’ll notice that to the user, the entire block of code seems to take 50 seconds. In those 5 seconds, your application can’t do anything like update the interface, and so it looks like it’s frozen. To solve this problem, we use threading.
Usually there are two parts to this problem; the overall set of things you want to process, and the operation that takes a while, that we’d like to chop up. In this case, the overall set is the for loop and the operation we want chopped up is the sleep(10) function.
Here’s a quick template for the threading code, based on our previous example. You should be able to work your code into this example.
To call this thread, all you have to do is: