Seite 1 von 1

Programm hängt sich auf :(

Verfasst: Dienstag 17. August 2004, 16:22
von N17R0
Hi,
also es wird in einem thread ein download durchgeführt und dann eine funktion gestarten, um zu gucken, ob noch mehr Downloads in der Liste stehen. Aber wenn kein Download mehr drin steht, hängt dich das Programm einfach auf. ich denke, dass es was mit dem thread zu tun hat.

Code: Alles auswählen

def startdownload():
    listboxdls = listbox.curselection()
    if len(listboxdls) != 0:
        downloaddata = files[int(listboxdls[0])]
        thread.start_new_thread(downloadfile,(downloaddata,))
    else:
        root.destroy()
      
def handleDownload(block):
    global file, filesize
    file.write(block)
    statusanzeige.set(('Status: %s/%s')%(str(file.tell()),str(filesize)))

def downloadfile(downloaddata):
    global file, filesize
    try:
        ftp = FTP()
        ftp.connect(host=downloaddata[0], port=int(portdata))
        statusanzeige.set('Status: connected')
        ftp.login(logindata, pwdata)
        statusanzeige.set('Status: logged in')
        ftp.cwd(downloaddata[1])
        statusanzeige.set('Status: path ok')
        filesize = ftp.size(downloaddata[2])
        statusanzeige.set('Status: get filesize')
        file = open(savepath+downloaddata[2], 'wb')
        statusanzeige.set('Status: start download')
        ftp.retrbinary('RETR ' + downloaddata[2], handleDownload)
        ftp.close()
        statusanzeige.set('Status: disconnected')
        file.close()
        listboxdls = listbox.curselection()
        listbox.selection_clear(int(listboxdls[0]))
    except:
        tkMessageBox.showwarning(title='Error!', message='Server ist down, voll oder die Files wurden deleted.')
        listboxdls = listbox.curselection()
        listbox.selection_clear(int(listboxdls[0]))
    startdownload()
Kann es sein, dass es ein Problem gibt, weil ich die funktion startdownload() aus einem thread heraus aufrufe und wenn ja, was kann ich dagegen tun?

Verfasst: Dienstag 17. August 2004, 18:57
von Dookie
Hi N17R0,

ich denke mal daß es probleme macht, daß die Threads in "startdownload()" gestartet werden und ihrerseits wieder startdownload() aufrufen. Besser währ in startdownload eine Schleife zu machen die alle Downloads startet.

Code: Alles auswählen

def startdownload():
    listboxdls = listbox.curselection()
    for entry in listboxdls:
        downloaddata = files[int(entry)]
        thread.start_new_thread(downloadfile,(downloaddata,))
        listbox.selection_clear(int(entry))
    #root.destroy() # besser warten bis alle Threads fertig sind
     
def handleDownload(block):
    global file, filesize
    file.write(block)
    statusanzeige.set(('Status: %s/%s')%(str(file.tell()),str(filesize)))

def downloadfile(downloaddata):
    global file, filesize
    try:
        ftp = FTP()
        ftp.connect(host=downloaddata[0], port=int(portdata))
        statusanzeige.set('Status: connected')
        ftp.login(logindata, pwdata)
        statusanzeige.set('Status: logged in')
        ftp.cwd(downloaddata[1])
        statusanzeige.set('Status: path ok')
        filesize = ftp.size(downloaddata[2])
        statusanzeige.set('Status: get filesize')
        file = open(savepath+downloaddata[2], 'wb')
        statusanzeige.set('Status: start download')
        ftp.retrbinary('RETR ' + downloaddata[2], handleDownload)
        ftp.close()
        statusanzeige.set('Status: disconnected')
        file.close()
    except:
        tkMessageBox.showwarning(title='Error!', message='Server ist down, voll oder die Files wurden deleted.')
        listboxdls = listbox.curselection()
        listbox.selection_clear(int(listboxdls[0]))
    #startdownload() # nicht mehr nötig 
so sollte es besser klappen, ist aber nicht getestet!

das mit den globalen variablen finde ich auch nicht so gut, besonders die variable "file" tut im bauch weh ;)


Gruß

Dookie

Verfasst: Dienstag 17. August 2004, 21:11
von N17R0
*gg* jo. mein Problem bei deiner Variante wär nur, dass dann doch alle dateien gleichzeig geladen werden, oder lieg ich da falsch? Ich möchte ja eigentlich, dass die Dateien nacheinander heruntergeladen werden.

Meine Variante klappt ja auch, wenn mehrere Dateien vorhanden sind, er hängt sich nur eben immer nach dem letzten Download auf.

Verfasst: Dienstag 17. August 2004, 22:03
von Dookie
dann mach die Schleife halt im Thread und übergib ihm die liste der Dateien.


Dookie

Verfasst: Mittwoch 18. August 2004, 14:59
von N17R0
ok, hab das jetzt mit der Schleife im thread gemacht, aber aufhängen tut er sich immernoch :(

Code: Alles auswählen

def downloadfile(listboxdls):
    global file, filesize
    for i in range(len(listboxdls)):
        downloaddata = files[int(listboxdls[0])]
        try:
            ftp = FTP()
            ftp.connect(host=downloaddata[0], port=int(portdata))
            statusanzeige.set('Status: connected')
            ftp.login(logindata, pwdata)
            statusanzeige.set('Status: logged in')
            ftp.cwd(downloaddata[1])
            statusanzeige.set('Status: path ok')
            filesize = ftp.size(downloaddata[2])
            statusanzeige.set('Status: get filesize')
            file = open(savepath+downloaddata[2], 'wb')
            statusanzeige.set('Status: start download')
            ftp.retrbinary('RETR ' + downloaddata[2], handleDownload)
            ftp.close()
            statusanzeige.set('Status: disconnected')
            file.close()
            listboxdls = listbox.curselection()
            listbox.selection_clear(int(listboxdls[0]))
        except:
            tkMessageBox.showwarning(title='Error!', message='Server ist down, voll oder die Files wurden deleted.')
            listboxdls = listbox.curselection()
            listbox.selection_clear(int(listboxdls[0]))
    tkMessageBox.showinfo(title='Fertig', message='Download fertig!')
komisch ist, dass wenn ich die messagebox am schluss weglasse, dass es dann funktioniert.