Frage: Aktualisierung von ListIconGadgets

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Frage: Aktualisierung von ListIconGadgets

Beitrag von Mr.X »

Hallooo erstmal.

Ich war lange nicht im Forum aktiv. Jetzt brauche ich einen kurzen Tip.

Also folgendes Problem:
Ich habe ein ListIconGadget, das eine Spalte für Dateinamen und zwei Ergebnis Spalten besitzt.
In einer Schleife werden die Dateinamen abgearbeitet und auf meinen FTP-Server geschrieben [funktioniert prima, soweit]. Innerhalb der Schleife soll das Bearbeitungsergebnis und danach der erfolgreiche oder fehlgeschlagene FTP-Transfer in die zugehörige Spalte geschrieben werden [mit SetGadgetItemText]. Der FTP-Transfer erfolgt asynchron. Mein Problem: Die Anzeige der in das ListIconGadget geschreibenen Ergebnisse erfolgt erst nach Schließen der FTP-Verbindung. Eine parallele Ausgabe z.B. des Dateinamens in der Statuszeile vor dem Transfer wird sofort angezeigt.

Hier der Code-Abschnitt [gLIC_FileList ist das ListIconGadget]

Code: Alles auswählen

                        StatusBarText(#STB_Main, 0, " FTP-Verbindung vorbereiten ...")
                        ftpNo = OpenFTP(#PB_Any, FTP_Server$, FTP_User$, FTP_Pwd$)
                        Debug ftpNo
                        
                        If ftpNo
                            Debug "\rai"
                            SetFTPDirectory(ftpNo, "rai")
                            Debug "\" +LastFirma$ +"_database"
                            SetFTPDirectory(ftpNo, LastFirma$ +"_database")
                            
                            For i = 1 To CountGadgetItems(gLIC_FileList)
                                tmpFilename$ = DB_Path$ +GetGadgetItemText(gLIC_FileList, i-1, 0)
                                StatusBarText(#STB_Main, 0, " Verschlüsseln und FTP (" +tmpFilename$ +")")
                                
                                If FileSize(tmpFilename$)
                                    If AES_Encrypt (tmpFilename$)
                                        SetGadgetItemText(gLIC_FileList, i-1, #TXT_OK, 2)
                                    Else
                                        SetGadgetItemText(gLIC_FileList, i-1, #TXT_Err, 2)
                                    EndIf
                                EndIf
                                InvalidateRect_(GadgetID(gLIC_FileList), 0, #True)
                                
                                Result = SendFTPFile(ftpNo, tmpFilename$ +".aes", GetGadgetItemText(gLIC_FileList, i-1, 0) +".aes", #True)
                                While FTPProgress(ftpNo) <> #PB_FTP_Finished
                                    If FTPProgress(ftpNo) <> #PB_FTP_Error
                                        :
                                    Else
                                        AbortFTPFile(ftpNo)
                                        SetGadgetItemText(gLIC_FileList, i-1, #TXT_Err, 3)
                                        Break
                                    EndIf
                                    ;Delay(100)
                                Wend
                                
                                If FTPProgress(ftpNo) = #PB_FTP_Finished
                                    SetGadgetItemText(gLIC_FileList, i-1, #TXT_OK, 3)
                                EndIf
                            Next
                            
                            CloseFTP(ftpNo)
                            StatusBarText(#STB_Main, 0, " FTP-Verbindung beendet")
                        EndIf
Hat jemand eine Lösung?

Danke schon 'mal im voraus.

Mr.X
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage: Aktualisierung von ListIconGadgets

Beitrag von ts-soft »

Du baust Deinen Mainloop in etwa so auf:

Code: Alles auswählen

Global PrgEnd
Procedure DoEvents(timeout = 0)
  Select WaitWindowEvent(timeout)
    Case #PB_Event_CloseWindow : PrgEnd = #True
    Case ...
    Case ...
  EndSelect
EndProcedure

; mainloop
Repeat
  DoEvents()
Until PrgEnd
Jetzt noch ein paar DoEvents(20) in Deine FTP Routinen und die Anzeige funktioniert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Re: Frage: Aktualisierung von ListIconGadgets

Beitrag von Mr.X »

Danke ts-soft.

Ich habe an anderer Stelle auch eine Lösung gefunden. Eine simple Schleife

Code: Alles auswählen

While WindowEvent() : Wend
an der Stelle des Delay(100)-Kommentars und die Anzeige funktioniert.

Also, das Problem ist gelöst.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage: Aktualisierung von ListIconGadgets

Beitrag von ts-soft »

Jetzt werden aber Events verschluckt, das Problem ist dann ein totes Fenster!
Wenn Du es tatsächlich so lösen möchtest, disable bitte alle Gadgets vorher,
sonst verärgerst Du die Nutzer Deines Programmes.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten