Programm hängt sich auf :(

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
N17R0
User
Beiträge: 53
Registriert: Samstag 6. März 2004, 23:41

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?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
N17R0
User
Beiträge: 53
Registriert: Samstag 6. März 2004, 23:41

*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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

dann mach die Schleife halt im Thread und übergib ihm die liste der Dateien.


Dookie
[code]#!/usr/bin/env python
import this[/code]
N17R0
User
Beiträge: 53
Registriert: Samstag 6. März 2004, 23:41

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.
Antworten