Beim Download friert der Prozess/das GUI ein - aber nur auf Vista/Xp

  • Es geht um folgendes Programm (ich hoffe mal, ich darf einfach den Link zu den Dateien posten):
    http://yt-downloader.ath.cx/download/files/V2.5.0.100811/
    Virustotal: http://www.virustotal.com/file-scan/repo…79bf-1282607482

    Wenn Links eingefügt sind und man auf "Download All" klickt, wird der Download gestartet.
    Auf Vista geschiet dann folgendes: Gar nichts. Das Fenster slidet nicht mehr nach rechts (was es tun sollte, sobald die Maus nicht darüber ist) und das Traymenü erscheint auch nicht mehr. Nach mehrfachen Klicks kommt das Bekannte "YT-Downloader blabla reagiert nicht mehr.". Wenn man einige zeit wartet, ist der Download jedoch dennoch fertig und alles ist wieder normal, wie es sein sollte.

    Auf Xp aktualisiert er das GUI immerhin so lange, bis es der Mauszeiger verlässt. Beim anschließenden Reinsliden sieht man nur die ProgressBar(s) und evtl. einen Button. Es passiert jedoch nichts, wenn man diesen klickt. Ob das Traymenü reagiert, weiß ich gerade allerdings nicht.

    Auf 7 dagegen funktioniert alles genau so, wie es sein sollte.

    Zusätzlich dazu: http://yt-downloader.ath.cx/mantisbt/view.php?id=2

    Ich habe mal die wichtigen Teile aus dem Source rausholt, weil ich den gesamten Code nicht gerne verteilen würde und es außerdem 1800 Zeilen wären.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; viel Init-stuff

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI_Main = GUICreate("YT-Downloader", 494, 129, -1, -1, BitOR($WS_DLGFRAME, $WS_POPUP))
    GUISetBkColor(0xFFFFFF)
    $pGUI_Main = Number($hGUI_Main)

    [/autoit] [autoit][/autoit] [autoit]

    $hLbl_Status = GUICtrlCreateLabel("", 0, 8, 166, 16, $SS_CENTER)
    GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif")
    GUICtrlCreatePic(@ScriptDir & "\Data\YT.jpg", 8, 40, 148, 57, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    $hBtn_Download = GUICtrlCreateButton("Download All", 336, 96, 80, 25, $WS_GROUP)
    $hBtn_Options = GUICtrlCreateButton("Options", 441, 100, 44, 21, $WS_GROUP)
    $hLbl_Video = GUICtrlCreateLabel("YouTube Videos:", 168, 8, 148, 15, $SS_CENTER)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $hList_Downloads = GUICtrlCreateList("", 168, 24, 148, 97, BitOR($LBS_SORT, $LBS_STANDARD, $WS_VSCROLL, $WS_BORDER))
    GUICtrlSetData(-1, "")
    $hCB_HD = GUICtrlCreateCheckbox("HD", 336, 8, 41, 17)
    $hCB_FHD = GUICtrlCreateCheckbox("Full-HD", 382, 8, 54, 17, BitOR($BS_CHECKBOX, $BS_AUTOCHECKBOX, $BS_LEFT, $WS_TABSTOP))
    $hCB_Mp3 = GUICtrlCreateCheckbox("Mp3", 444, 8, 41, 17, BitOR($BS_CHECKBOX, $BS_AUTOCHECKBOX, $BS_RIGHT, $WS_TABSTOP))
    $hPrg_Current = GUICtrlCreateProgress(336, 26, 148, 17)
    $hLabel3 = GUICtrlCreateLabel("Total:", 424, 48, 27, 17)
    $hLbl_DlCur = GUICtrlCreateLabel("0%", 386, 48, 30, 17, $SS_RIGHT)
    $hLbl_DlTot = GUICtrlCreateLabel("0%", 454, 48, 30, 17, $SS_RIGHT)
    $hLbl_Dl = GUICtrlCreateLabel("Waiting", 336, 48, 49, 17, $SS_RIGHT)
    $hPrg_Total = GUICtrlCreateProgress(336, 66, 148, 17)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WinSetTrans($hGUI_Main, '', 0) ; Invisible
    _SlideWin($hGUI_Main, "in", "right") ; Set position
    $bSlidedIn = True
    GUISetState(@SW_SHOW, $hGUI_Main)
    For $iStep = 000 To 255 Step 12 ; Fade in
    WinSetTrans($hGUI_Main, '', $iStep)
    Sleep(10)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; stuff

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetOnEvent($hBtn_Download, "_OnClick_Download")
    GUICtrlSetOnEvent($hBtn_Options, "_Options")
    ; ===========================
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Restore", $hGUI_Main)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_OnEventClose_Main", $hGUI_Main)
    ; ===========================
    AdlibRegister("_Adlib", 100)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(200)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Adlib() ; Do every 100 ms !
    ; Slide
    Switch _WinIsHovered($hGUI_Main, $hDll_User32)
    Case 1
    If ($bNoSlide = False) And ($bSlidedIn = False) Then
    _SlideWin($hGUI_Main, "in", "right")
    $bSlidedIn = True
    EndIf
    Case 0
    If $bSlidedIn And ($bNoSlide = False) Then
    _SlideWin($hGUI_Main, "out", "right")
    $bSlidedIn = False
    EndIf
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _OnEventClose_Main()
    Exit -3
    EndFunc ;==>_OnEventClose_Main

    [/autoit] [autoit][/autoit] [autoit]

    Func _OnClick_Download()
    If $bDownloading Then $bDownloading = False
    If _GUICtrlListBox_GetCount($hList_Downloads) Then _Timer_SetTimer($hGUI_Main, 100, "_InitializeDownload")
    EndFunc ;==>_OnClick_Download

    [/autoit] [autoit][/autoit] [autoit]

    Func _Options()
    _LogLoad()
    GUISetState(@SW_SHOW, $hGUI_Option) ; Hab ich mir mal gespart, wäre überflüssig gewesen
    WinActivate($hGUI_Option)
    EndFunc ;==>_Options

    [/autoit] [autoit][/autoit] [autoit]

    Func _Restore()
    If Not $bSlidedIn And Not $bNoSlide Then ; If Not ($bSlidedIn Or $bNoSlide)
    _SlideWin($hGUI_Main, "in", "right")
    $bSlidedIn = True
    Sleep(700)
    EndIf
    EndFunc ;==>_Restore

    [/autoit] [autoit][/autoit] [autoit]

    ; jetzt gehts los
    Func _InitializeDownload($hWnd, $Msg, $iIDTimer, $dwTime) ; Timer params
    _Timer_KillTimer($hGUI_Main, $iIDTimer) ; $iTimerID3

    [/autoit] [autoit][/autoit] [autoit]

    $bDownloading = True

    [/autoit] [autoit][/autoit] [autoit]

    Dim $sFinished = "", $iDownloaded = 0, $bError = False, $iIcon = 1

    [/autoit] [autoit][/autoit] [autoit]

    While _GUICtrlListBox_GetCount($hList_Downloads)
    ; stuff

    [/autoit] [autoit][/autoit] [autoit]

    $sText = _GUICtrlListBox_GetText($hList_Downloads, 0)
    GUICtrlSetData($hLbl_Video, $sText)
    _GUICtrlListBox_DeleteString($hList_Downloads, 0)
    $sYtURL = Eval(StringRegExpReplace($sText, "[\[\]]", ''))
    If @error Then
    $bError = True
    _LogWrite("Error - Download", "Could not allocate URl", $sText)
    Else
    _Download($sYtURL)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $bDownloading = False Then ; If canceled
    ; stuff
    ExitLoop
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $bError = True Then ; If failed
    ; stuff
    ExitLoop
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $bDownloading = False

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_InitializeDownload

    [/autoit] [autoit][/autoit] [autoit]

    Func _Download($sURL)
    ; stuff
    $iDlSize = InetGetSize($sDownloadLink)
    If Not $iDlSize Then $bError = True
    ; stuff

    [/autoit] [autoit][/autoit] [autoit]

    ;Download
    $hDL = InetGet($sDownloadLink, $sFileName, 0, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Download_percent, $iTotal, $finished, $downloading, $Total_percent

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $iSize2 = InetGetInfo($hDL, 0)
    $Download_percent = Round((100 * $iSize2) / $iDlSize, 1)
    GUICtrlSetData($hPrg_Current, Floor($Download_percent))
    GUICtrlSetData($hLbl_DlCur, $Download_percent & "%") ; Set GUI
    GUICtrlSetData($hLbl_Dl, "Dl:" & $sFMT)

    [/autoit] [autoit][/autoit] [autoit]

    $iTotal = $iDownloaded + _GUICtrlListBox_GetCount($hList_Downloads) + 1 ; Currently downloading but deleted in List
    $finished = ($iDownloaded * 100 / $iTotal)
    $downloading = $Download_percent / $iTotal

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($hCB_Mp3) = 1 Then $downloading = $downloading * (3 / 4) ; Needs to convert

    [/autoit] [autoit][/autoit] [autoit]

    $Total_percent = $finished + $downloading

    [/autoit] [autoit][/autoit] [autoit]

    ; Taskbar-Zeugs entfernt, würde eh nur verwirren

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($hPrg_Total, Floor($Total_percent)) ; Set GUI
    GUICtrlSetData($hLbl_DlTot, Round($Total_percent, 1) & "%")
    Sleep(200)
    Until ($iSize2 >= $iDlSize) Or $bDownloading = False

    [/autoit] [autoit][/autoit] [autoit]

    ; stuff
    EndFunc ;==>_Download

    [/autoit]


    Kann noch improvisiert werden, aber atm würde ich gerne das Problem lösen. Ich hab einige Dinge ausgelassen, die aber an sich nichts mit dem Download zu tun haben sondern nur drum herum sind. Variablendeklaration hab ich weggelassen, die globalen Variablen sollten sowieso offensichtlich sein.

    Meine Vermutung geht in Richtung InetGet oder AdlibRegister, was evtl verschiedene Verhaltensweisen auf Vista, Xp und 7 hervorrufen könnte, aber ich habe keinerlei Anhaltspunkte.

    Ich habe bereits auf autoitsoure danach gesucht, aber es scheint niemand, dasselbe Problem zu haben.
    Wenn jemand Xp oder Vista benutzt, dann lädt er das Programm am besten selbst runter und spielt damit was rum.
    Es wäre schön, wenn jemand von euch ne Idee dazu hätte ;)
    Bei Unklarheiten natürlich fragen.

    6 Mal editiert, zuletzt von FichteFoll (26. August 2010 um 16:48) aus folgendem Grund: Titel geändert

  • Hallo FichteFoll,

    kann in deinem stark gekürztem Skript weder

    [autoit]

    InetGet

    [/autoit]

    noch

    [autoit]

    Addlib

    [/autoit]

    finden. Ich tendiere aber dazu das

    [autoit]

    _InetGetSource

    [/autoit]

    (finde ich zwar auch nicht) die schuldige Func ist. Solange du nicht wenigstens einen Link zum Analyse-Ergenis der Überpüfung des Files bei VirusTotal.com einstellst, wird es kaum jemanden geben der es testet. Bei meinen [Beispiel] NeMP3-P (MP3-Player) Version 0.8.4.7 habe ich es so gemacht, dort habe ich auch dass Problem das am Anfang der Update-Funktion die GUI nicht reagiert,
    Besser wäre natürlich der Source. Die Filegrösse kommt mir für eine AutoIt.exe auch übermässig gross vor.

    Edit: ich habe mich jetzt doch getraut, habe das Tool trotz der Grösse von 5 MB downgeloadet (magere INet-Verbindng derzeit 18 KB/s) habe es entpackt bei Virstotal deine Exe checken lassen siehe:
    http://www.virustotal.com/file-scan/repo…79bf-1282607482

    Mir ist aufgefallen dass du dich mit "fremden Federn schmückst" soll hsisen du benutzt ffmpeg zur Konvertierung des downgeloadeten Files erwähnst aber in keiner Weise, dass du ein Fremdprogramm benutzt. Dies ist eindeutig ein Verstoss gegen die GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 die dem Originaldownload von ffmpeg beiliegt,

    Edit2: GPL Licence angehängt,

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (24. August 2010 um 02:25)

  • Hallo FichteFoll,

    kann in deinem stark gekürztem Skript weder "InetGet" noch "Addlib" finden. Ich tendiere aber dazu das "_InetGetSource" (finde ich zwar auch nicht) die schuldige Func ist. Solange du nicht wenigstens einen Link zum Analyse-Ergenis der Überpüfung des Files bei VirusTotal.com einstellst, wird es kaum jemanden geben der es testet. Bei meinen [Beispiel] NeMP3-P (MP3-Player) Version 0.8.4.7 habe ich es so gemacht, dort habe ich auch dass Problem das am Anfang der Update-Funktion die GUI nicht reagiert,
    Besser wäre natürlich der Source.

    Mir ist aufgefallen dass du dich mit "fremden Federn schmückst" soll hsisen du benutzt ffmpeg zur Konvertierung des downgeloadeten Files erwähnst aber in keiner Weise, dass du ein Fremdprogramm benutzt. Dies ist eindeutig ein Verstoss gegen die GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 die dem Originaldownload von ffmpeg beiliegt,

    Du hast recht, den Teil mit InetGet hatte ich vergessen, habe es jetzt korrigiert. AdlibRegister kommt jedoch am Anfang vor (bei den anderen OnEvent-Registrierungsfunktionen) und _InetGetSource habe ich gar nicht benutzt, sondern die Schritte manuell gemacht. Daran kann es aber irgendwie nicht liegen, weil das viel zu schnell geht.

    Virustotal Link habe ich oben eingefügt, danke.

    In der ReadMe.txt habe ich vermerkt, dass ich ffmpeg zum Konvertieren verwende, aber im "About"-Tab noch nicht. Ich muss sowieso erst noch gucken, ob ich das YT-Logo überhaupt verwenden darf.

  • Hallo FichteFoll,

    hast du dir meinen Player (Link siehe Signatur) angesehen :?: Das Prog reagiert Self-Updates (mit Ausnahme beim Seiten auslesen mit _InetGetSorce) ach während des auf jeden Tastendruck, da ich InetGetInfo in einer AdlinRegister(t) Fuunc abfrage und nicht in einer Schleife.

    Zitat

    In der ReadMe.txt habe ich vermerkt, dass ich ffmpeg zum Konvertieren verwende, aber im "About"-Tab noch nicht. Ich muss sowieso erst noch gucken, ob ich das YT-Logo überhaupt verwenden darf.

    das mit demYT-Logo bezweifle ich.

    Zu ffmpeg du must auch mindestens die COPYING.GPLv3.txt die im Oririnalink enthalten ist beifügen (besser die ganze Dokumentation) und evetuell beim Installieren einen (einmaligen) Hinweis auf die fremde EXe, Copyright etc. einblenden, damit solltest du die Mindestanforderungen erfüllt haben

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (25. August 2010 um 01:08)

  • Ich habe mal das Verhalten während des Downloads analysiert und ein paar Methoden ausprobiert.

    Starten des Downloads mit AdlibRegister: Das Fenster reagiert nicht mehr auf die Maus, weil ich die Routine dafür auch in einer Adlib-Funktion gelagert habe, sodass diese auch während des Downloads ausgeführt wird. Da allerdings gewartet wird, bis ein Adlib-Callback abgeschlossen ist, wird diese Funktion nicht aufgerufen.

    Benutzen von mehreren Threads via "CreateThread": Die Messagebox zur Überprüfung wird gestartet, aber bei Variablen crasht Autoit.

    Starten des Downloads mit "_Timer_SetTimer" (wie ich es zuvor machte): Es wird nach x ms ein neuer Thread mit der Downloadfunktion gestartet, wodurch alles normal funktioniert.

    Ich kann mir nur einfach nicht erklären, wieso das unter Vista und Xp anders funktioniert. Werden dort Timer-Events anders gehandhabt und zB kein neuer Thread gestartet? Das erklärt dann allerdings nicht, wieso der Prozess komplett einfriert und die Progressbars ebenfalls nicht aktualisiert werden.

    Auf Xp könnte man vielleicht darauf zurückschließen, dass das Timerevent verwaltet und die Funktion gestartet wird. Anschließend wird nachwievor "_Adlib" aufgerufen, aber es wird auf keine anderen Events mehr geachtet bzw diese alle in die Schleife eingehängt, weil ja das Timerevent noch nicht abgeschlossen ist.

    Trotzdem ist es bescheuert... Achja, ich vermute demnach übrigens, dass _Timer_SetTimer schuld ist. Alternative dazu wäre, dass ich die Funktion (Wie ganz zuvor, bevor ich mehrere Downloads parallel hatte) über ein Flag in der globalen While-Schleife aufrufen lasse. So wäre es zwar umständlicher, aber was solls.

  • Hast du schon verscht den Download normal (also nach buttonclick) zu starten und nr den Progress in eine Adlib-Schleife auszulagern. Bei erreichen von 100% musst diese natürlich mit AdlibUnregister wieder deregistrieren,

    mfg autoBert

  • Hi FichteFoll,

    tut mir Leid, dass ich mich in euer Fachgespräch einmische, aber zur Not kannst du eine 2. EXE benutzen, um das Mainscript zu entlasten.
    Edit1: Tolle AutoIt Hilfe, was sie verspricht, hält sie nicht, und ein weiteres beispiel schaffe ich nicht mehr. Genaueres sage ich bei nächster Antwort oder Bedarf.

  • tut mir Leid, dass ich mich in euer Fachgespräch einmische, aber zur Not kannst du eine 2. EXE benutzen, um das Mainscript zu entlasten.

    Wenn ich den Download über ein anderes Script/andere exe laufen lasse, kann ich nicht/nur umständlich mit dem Mainthread kommunizieren. Also den Download abbrechen, Variablen überprüfen, auf Optionen Rücksicht nehmen, den Status anzeigen usw.

    Ich mach es einfach mal wie in meinem letzten Post beschrieben und teste mal, ob es dann funktioniert.

  • Danke für den Link, aber ich habe es jetzt wie oben gelöst und die Funktion über die While-Schleife aufgerufen. Anscheinend funktioniert es jetzt sowohl auf Xp als auch auf Vista.

    Es war wohl _Timer_SetTimer schuld, welches auf den verschiedenen OS anders funktioniert.