Muss ich mal heute Abend schauen, ob ich's hin bekomm. So ganz blick ichs gerade noch nicht
Danke euch Jungs
Zeitriss, wegen GUICtrlRead($progr_dateidown) <> $FileProgress schau ich
Muss ich mal heute Abend schauen, ob ich's hin bekomm. So ganz blick ichs gerade noch nicht
Danke euch Jungs
Zeitriss, wegen GUICtrlRead($progr_dateidown) <> $FileProgress schau ich
Wenn Du die Funktion "_patch" über ein GUI-Event aufrufst, dann ist GUIGetMsg so lange gesperrt (reagiert nicht auf weitere Events), wie die Funktion abgearbeitet wird.
Das heißt, dass Du das Patch-Konzept ganz auf eine nicht blockierende Funktion abändern musst, wenn Du weiter auf die GUI-Events reagieren willst.
Und noch ein Hinweis zu INetGet: Wenn Du den Background-Modus benutzt, bekommst Du ein Handle zurück. Dieses muss unbedingt nach dem Download mit InetClose geschlossen werden. Ansonsten liegt noch ein Lock auf der Datei.
Hallo @Oscar,
ja ich möchte eig. noch auf Gui-Events reagieren können. Aber ich hab keine Ahnung wie ich so eine nicht blockierende Funktion aufbauen muss, um ehrlich zu sein.
Okey aber das mit dem INetGet funktioniert einwandfrei, auch ohne Close. Wenn du dir meinen Code anschaust, muss das an die Stelle?
Else
FileDelete($localfile)
$Download = InetGet($serverhttp & $val[$i][0], $localfile, $INET_FORCERELOAD, 1)
$sizeb = InetGetSize($serverhttp & $val[$i][0], $INET_FORCERELOAD)
Do
$BytesDownloaded = InetGetInfo($Download, 0)
$FileProgress = Floor(($BytesDownloaded / $sizeb) * 100)
If GUICtrlRead($progr_dateidown) <> $FileProgress Then
GUICtrlSetData($progr_dateidown, $FileProgress)
GUICtrlSetData($label_dateidown, $FileProgress & " %")
EndIf
Until InetGetInfo($Download, 2)
GUICtrlSetData($label_dateidown, "")
EndIf
Next
GUICtrlSetData($progr_fortschritt, 100)
_Crypt_Shutdown()
InetClose($Download) ;<-------------------------
GUICtrlSetState($button_start, $GUI_ENABLE)
MsgBox(0, "Fertig", "Der Patcher ist fertig, du kannst das Spiel nun starten.")
EndFunc
Alles anzeigen
Ich habe mir mal die Mühe gemacht und einen nicht blockierenden Downloader geschrieben (siehe unten).
Ich verwende hier allerdings den OnEvent-Modus, weil dort die Schleifengeschwindigkeit nicht von Mausbewegungen/Tastatureingaben abhängt ,wie das im MessageLoop-Modus der Fall wäre.
Der wesentliche Unterschied zu Deinem Script ist, dass ich die Event-Funktionen "sofort" wieder verlasse. Damit bleibt die GUI bedienbar.
Die Downloads finden in der Endlosschleife (while true) statt und auch diese wird nicht blockiert durch weitere Schleifen, sondern es werden nur die anfallenden Daten ausgewertet.
Ich hoffe, dass das einigermassen verständlich ist!?
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <InetConstants.au3>
Global $aDownloads[4] = ['https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe', _
'https://www.autoitscript.com/autoit3/files/beta/autoit/autoit-v3.3.15.0-beta-setup.exe', _
'https://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe', _
'https://notepad-plus-plus.org/repository/7.x/7.3.2/npp.7.3.2.Installer.exe']
Global $iDownloadCount = 0
Global $iPercent = 0, $iPercentOld = 0, $iPercentAll = 0, $iPercentAllOld = 0
Global $fStart = False, $fStop = False
Global $hDownload = -1, $iDownloadSize
Opt('GUIOnEventMode', 1)
Global $hGui = GUICreate('File Downloader', 420, 250)
GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
Global $idProgressAll = GUICtrlCreateProgress(10, 100, 400, 16)
Global $idPercentAll = GUICtrlCreateLabel('0%', 10, 120, 400, 20, $ES_CENTER)
GUICtrlSetFont(-1, 10, 600)
Global $idProgress = GUICtrlCreateProgress(10, 150, 400, 16)
Global $idPercent = GUICtrlCreateLabel('0%', 10, 170, 400, 20, $ES_CENTER)
GUICtrlSetFont(-1, 10, 600)
Global $idStart = GUICtrlCreateButton('Start', 10, 30, 100, 25)
GUICtrlSetOnEvent(-1, '_StartNextDownload')
Global $idStop = GUICtrlCreateButton('Stop', 120, 30, 100, 25)
GUICtrlSetOnEvent(-1, '_StopDownload')
GUICtrlSetState(-1, $GUI_DISABLE)
Global $hStatus = _GUICtrlStatusBar_Create($hGui)
GUISetState()
While Sleep(10)
If $fStart Then ; wenn der Download gestartet wurde
If InetGetInfo($hDownload, $INET_DOWNLOADERROR) Then ; wenn ein Fehler aufgetreten ist
InetClose($hDownload) ; das Handle schliessen
_GUICtrlStatusBar_SetText($hStatus, 'Download Fehler')
$fStart = False
Else ; kein Fehler, also hier weiter
$iPercentAll = Int(100 / UBound($aDownloads) * ($iDownloadCount + 1))
If $iPercentAll <> $iPercentAllOld Then ; die Anzeige nur aktualisieren, wenn sich der Wert geaendert hat
$iPercentAllOld = $iPercentAll
GUICtrlSetData($idProgressAll, $iPercentAll)
GUICtrlSetData($idPercentAll, $iPercentAll & '%')
EndIf
$iPercent = Int(100 / $iDownloadSize * InetGetInfo($hDownload, $INET_DOWNLOADSIZE))
If $iPercent <> $iPercentOld Then ; die Anzeige nur aktualisieren, wenn sich der Wert geaendert hat
$iPercentOld = $iPercent
GUICtrlSetData($idProgress, $iPercent)
GUICtrlSetData($idPercent, $iPercent & '%')
EndIf
If $fStop Then ; wenn der Benutzer auf "Stop" geklickt hat
InetClose($hDownload) ; das Handle schliessen
_GUICtrlStatusBar_SetText($hStatus, 'Download abgebrochen')
$fStop = False
$fStart = False
$iDownloadCount = 0
GUICtrlSetState($idStart, $GUI_ENABLE)
GUICtrlSetState($idStop, $GUI_DISABLE)
Else ; nicht auf "Stop" geklickt, also hier weiter
If InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE) Then ; wenn der Download abgeschlossen ist
InetClose($hDownload) ; das Handle schliessen
$iDownloadCount += 1 ; den Download-Zaehler erhoehen
If $iDownloadCount = UBound($aDownloads) Then ; wenn das Ende erreicht ist
_GUICtrlStatusBar_SetText($hStatus, 'Download fertig')
$fStart = False
$iDownloadCount = 0
GUICtrlSetState($idStart, $GUI_ENABLE)
GUICtrlSetState($idStop, $GUI_DISABLE)
Else ; das Ende ist noch nicht erreicht, also
_StartNextDownload() ; den naechsten Download starten
EndIf
EndIf
EndIf
EndIf
EndIf
WEnd
Func _StartNextDownload()
GUICtrlSetState($idStart, $GUI_DISABLE)
GUICtrlSetState($idStop, $GUI_ENABLE)
Local $sFilename = @ScriptDir & '\' & StringRegExpReplace($aDownloads[$iDownloadCount], '.+\/(.+)', '$1')
ConsoleWrite('URL: "' & $aDownloads[$iDownloadCount] & '"' & @CR)
ConsoleWrite('Filename: "' & $sFilename & '"' & @CR)
$hDownload = InetGet($aDownloads[$iDownloadCount], $sFilename, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
_GUICtrlStatusBar_SetText($hStatus, 'Download ' & $iDownloadCount & ' gestartet')
$iDownloadSize = InetGetSize($aDownloads[$iDownloadCount])
ConsoleWrite('Size: ' & $iDownloadSize & @CR)
$fStart = True
EndFunc ;==>_StartNextDownload
Func _StopDownload()
$fStop = True
EndFunc ;==>_StopDownload
Func _End()
InetClose($hDownload)
Exit
EndFunc ;==>_End
Alles anzeigen