ProgressBar stockt bei angeklicktem Fenster

  • Ich habe mir eine Funktion für eine ProgressBar erstellt die mit einer Schleife auf Zeit abläuft:

    [autoit]


    ;GUI Fortschritt
    $gui_progressbar = GUICreate("Lesen/Schreiben", 300, 100)
    GUICtrlCreateLabel("Vorgang läuft ...", 12, 10, 300, 18)
    GUICtrlSetFont(-1, 9, 600, 0)
    $progressbar = GUICtrlCreateProgress(10, 40, 280, 20)
    $label_progressbar = GUICtrlCreateLabel("", 12, 70, 40, 18)

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

    Func _getDOSOutput($command, $zeitende)
    Local $text, $Pid = Run('"' & @ComSpec & '" /c ' & $command, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    _ProgressBar($zeitende)
    While 1
    $text &= StdoutRead($Pid)
    If @error Then ExitLoop
    GUICtrlSetData($edit_dir, GUICtrlRead($edit_dir) & $text)
    Sleep(10)
    WEnd
    Return $text
    EndFunc

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

    Func _ReadIECOK()
    _ReadIECClose()
    Local $ext, $progress, $ordnername = GUICtrlRead($input_ordnername)
    If GUICtrlRead($radio1) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 750
    $lesen = "d64copy.exe -t auto -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio2) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 4590
    $lesen = "d64copy.exe -t original -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio3) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 1460
    $lesen = "d64copy.exe -t serial1 -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio4) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 750
    $lesen = "d64copy.exe -t serial2 -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio5) = $GUI_CHECKED Then
    $ext = ".nbz"
    $progress = 300
    $lesen = "nibread.exe -D" & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    EndIf
    If FileExists($ordnername & GUICtrlRead($input_dateinameimage) & $ext) Then
    If MsgBox(52, "Hinweis", "Datei existiert bereits. Überschreiben?") = 6 Then
    FileDelete ($ordnername & GUICtrlRead($input_dateinameimage) & $ext)
    Else
    _ReadIEC()
    Return 0
    EndIf
    EndIf
    $dir = _getDOSOutput($lesen, $progress)
    GUICtrlSetData($edit_dir, $dir)
    EndFunc

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

    Func _ProgressBarStart()
    GUISetState(@SW_DISABLE, $gui_main)
    GUISetState(@SW_SHOW, $gui_progressbar)
    EndFunc
    Func _ProgressBarStop()
    GUISetState(@SW_ENABLE, $gui_main)
    GUISetState(@SW_HIDE, $gui_progressbar)
    EndFunc

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

    Func _ProgressBar($zeit)
    _ProgressBarStart()
    Sleep(3000) ;3 Sekunde warten
    For $i = 0 To 100
    GUICtrlSetData($progressbar, $i)
    GUICtrlSetData($label_progressbar, $i & "%")
    Sleep($zeit)
    Next
    GUICtrlSetData($label_progressbar, "Fertig!")
    Sleep(1000) ;1 Sekunde warten
    _ProgressBarStop()
    EndFunc

    [/autoit]

    Das Unschöne dabei ist allerdings, wenn man das Fenster mit der Bar mit der Maus gedrückt hält, wird die Bar angehalten sollange man die Maus gedrückt hält und setzt dann bei der letzten Stelle fort. Der Vorgang meiner Funktion läuft natürlich im Hintergrund weiter und ist dann beendet wärend die Bar noch läuft.

    Hat da jemand vielleicht eine Idee dazu?

  • Hallo DerSchatten,

    auf diese spezielle Frage wirst du wohl keine Antwort bekommen, mach also bitte ein allgemen gültiges Beispielprogramm in dem der Effekt auftritt.

    mfg autoBert

  • Wenn du das Fenster eines AutoIt Scripts mit der Maus verschiebst, wird das Script pausiert. Das lässt sich zum Beispiel mit den _Timer Funktionen umgehen. Aber um dir dabei wirklich zu helfen, brauchen wir schon ein funktionsfähiges Beispielscript wie autoBert schon sagte.

  • Wenn du das Fenster eines AutoIt Scripts mit der Maus verschiebst, wird das Script pausiert


    Genau das ist es.
    Das Script könnte ich zwar reinstellen, würde aber nicht laufen weil es für diese Funktion eine externe hardware vorraussetzt mit denen meine Command-Befehle laufen.

    Vielleicht könntest du mir ein Beispiel mit einer Timer-Funktion geben. Läßt sich damit das Fenster sperren?

  • Zitat

    Vielleicht könntest du mir ein Beispiel mit einer Timer-Funktion geben. Läßt sich damit das Fenster sperren?


    Nein, damit lässt sich nicht das Fenster sperren. Mit der Funktion _Timer_SetTimer kann man eine Funktion in einem bestimmten Intervall aufrufen, genau wie bei AdlibRegister. Die Funktion wird allerdings auch aufgerufen, wenn das Fenster gerade verschoben wird.
    Schau dir am besten mal das Beispiel in der Hilfe an ;).

    [autoit]

    _Timer_SetTimer()

    [/autoit]
  • kleines beispiel, so sollte es gehen:

    [autoit]


    #include <Timers.au3>
    $maingui = GUICreate("test", 640, 480)
    GUISetState()
    ProgressOn("Progress Meter", "Increments every second", "0 percent")
    $i = 10
    _Timer_SetTimer($maingui,1000,"addup")
    while $i < 100
    sleep(20)
    Switch GUIGetMsg ()
    case -3
    Exit
    endswitch
    wend
    _Timer_KillAllTimers($maingui)
    ProgressSet(100 , "Done", "Complete")
    sleep(500)
    ProgressOff()

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

    func addup($a, $b, $c, $d)
    if $i < 100 then $i += 10
    ProgressSet( $i, $i & " percent")
    endfunc

    [/autoit]
  • Nein tut es nicht. Ließ dir mal die Hilfe zu ProgressOn durch, dann siehst du woran es liegt ;).
    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Timers.au3>

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

    $hWnd_Main = GUICreate("test", 640, 480)
    $cProgress = GUICtrlCreateProgress(50, 50, 200, 25)
    GUISetState()

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

    $nValue = 0
    $nSpeed = 20
    _Timer_SetTimer($hWnd_Main, 1000, "_SetProgressValue")

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

    While True
    Switch GUIGetMsg()
    Case -3
    _Timer_KillAllTimers($hWnd_Main)
    Exit
    EndSwitch
    WEnd

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

    Func _SetProgressValue($hWnd, $Msg, $iIDTimer, $dwTime)
    $nValue += $nSpeed
    Switch True
    Case $nValue >= 100
    $nValue = 100
    $nSpeed *= -1
    Case $nValue <= 0
    $nValue = 0
    $nSpeed *= -1
    EndSwitch
    GUICtrlSetData($cProgress, $nValue)
    EndFunc ;==>addup

    [/autoit]
  • Hallo DerSchatten,

    so sollte dein Skript laufen und der Progress nach der definierten Zeit fertig sein:

    Spoiler anzeigen
    [autoit]

    ;GUI Fortschritt
    $gui_progressbar = GUICreate("Lesen/Schreiben", 300, 100)
    GUICtrlCreateLabel("Vorgang läuft ...", 12, 10, 300, 18)
    GUICtrlSetFont(-1, 9, 600, 0)
    $progressbar = GUICtrlCreateProgress(10, 40, 280, 20)
    $label_progressbar = GUICtrlCreateLabel("", 12, 70, 40, 18)

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

    Func _getDOSOutput($command, $zeitende)
    Local $text, $Pid = Run('"' & @ComSpec & '" /c ' & $command, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    _ProgressBar($zeitende)
    While 1
    $text &= StdoutRead($Pid)
    If @error Then ExitLoop
    GUICtrlSetData($edit_dir, GUICtrlRead($edit_dir) & $text)
    Sleep(10)
    WEnd
    Return $text
    EndFunc ;==>_getDOSOutput

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

    Func _ReadIECOK()
    _ReadIECClose()
    Local $ext, $progress, $ordnername = GUICtrlRead($input_ordnername)
    If GUICtrlRead($radio1) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 750
    $lesen = "d64copy.exe -t auto -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio2) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 4590
    $lesen = "d64copy.exe -t original -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio3) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 1460
    $lesen = "d64copy.exe -t serial1 -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio4) = $GUI_CHECKED Then
    $ext = ".d64"
    $progress = 750
    $lesen = "d64copy.exe -t serial2 -d " & GUICtrlRead($combo_laufwerktyp) & " " & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    ElseIf GUICtrlRead($radio5) = $GUI_CHECKED Then
    $ext = ".nbz"
    $progress = 300
    $lesen = "nibread.exe -D" & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & GUICtrlRead($input_dateinameimage) & $ext & '" '
    EndIf
    If FileExists($ordnername & GUICtrlRead($input_dateinameimage) & $ext) Then
    If MsgBox(52, "Hinweis", "Datei existiert bereits. Überschreiben?") = 6 Then
    FileDelete($ordnername & GUICtrlRead($input_dateinameimage) & $ext)
    Else
    _ReadIEC()
    Return 0
    EndIf
    EndIf
    $dir = _getDOSOutput($lesen, $progress)
    GUICtrlSetData($edit_dir, $dir)
    EndFunc ;==>_ReadIECOK

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

    Func _ProgressBarStart()
    GUISetState(@SW_DISABLE, $gui_main)
    GUISetState(@SW_SHOW, $gui_progressbar)
    EndFunc ;==>_ProgressBarStart

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

    Func _ProgressBarStop()
    AdlibUnRegister("_stepProgress")
    GUICtrlSetData($label_progressbar, "Fertig!")
    Sleep(1000) ;1 Sekunde warten
    GUISetState(@SW_ENABLE, $gui_main)
    GUISetState(@SW_HIDE, $gui_progressbar)
    EndFunc ;==>_ProgressBarStop

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

    Func _stepProgress()
    $i = Int(GUICtrlRead($progressbar) + 1)
    GUICtrlSetData($progressbar, $i)
    GUICtrlSetData($label_progressbar, $i & "%")
    if $i = 100 Then _ProgressBarStop()
    EndFunc ;==>_stepProgress

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

    Func _ProgressBar($zeit)
    _ProgressBarStart()
    Sleep(3000) ;3 Sekunde warten
    GUICtrlSetData($progressbar, 0)
    AdlibRegister(_stepProgress, $zeit)
    EndFunc ;==>_ProgressBar

    [/autoit]

    mfg auftoBert