Über _timer_settimer in einem Label mit GUICtrlSetData Wert aus Extra-Funktion eintragen und runterzählen

  • Hallo! Ich nutze AutoIt nun eine kleine Weile und dieses Forum hat mir schon oft geholfen, wenn ich Probleme hatte. Diesmal habe ich weder hier, noch in der Holfe oder sonstwo eine Lösung zu meinem Problem gefunden, das wie folgt aussieht:

    Ich habe eine Funktion, welche mir einen Wert bis zu einem bestimmten Tag errechnet, dieser Wert ist die Restzeit in Sekunden. Den Wert schreibe ich dann in eine Variable $timeUntilNextEvent.

    Nun möchte ich, dass dieser Wert in dem Label runtergezählt wird, was ich auch über Sleep hinbekommen habe:

    Spoiler anzeigen
    [autoit]


    Func refreshLabel($extraNameData, $labelToRefresh, $numberToBeRefreshed, $delay = 1)

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

    ;$extraNameData ist ein Name, welchen das Programm aus einem Feld ausliest
    ;$labelToRefresh das Label, in das ich das Ergebnis, also den Counter auch eintrage
    ;$numberToBeRefreshed die Zahl, welche errechnet wurde.

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

    $delay = $delay * 1000
    $numberCount = $numberToBeRefreshed

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

    $countDown = $numberCount

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

    Do
    If $countDown > 0 Then
    $labelContent = $extraNameData & ", die Restzeit bis zum nächsten Meilenstein beträgt: " & $numberCount & " Sekunden"
    $numberCount -= 1
    GUICtrlSetData($labelToRefresh, $labelContent)
    EndIf
    $countDown -= 1

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

    Sleep($delay)

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

    Until $countDown = 0

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

    EndFunc

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

    Das Problem ist jetzt nur, dass, sobald mein Programm anfängt, runterzuzählen, nichts mehr reagiert, weil das Programm in der Funktion bleibt.

    Das wollte ich über _timer_settimer lösen, welches sich in meiner main befindet und diese Funktion auslöst.

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

    Func setCountInLabelTimeLeft($hWnd, $iMsg, $iIDTimer, $dwTime)

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

    GUICtrlSetData($labelTimeLeft, $timeUntilNextEvent)

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

    EndFunc

    [/autoit]

    Nur bekomme ich den $timeUntilNextEvent-Wert, der errechnete, nicht in die GUICtrlSetData rein, weder über Extra-Parameter noch sonstwie.

    Hier noch meine main dazu:

    Spoiler anzeigen
    [autoit]


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnExit
    ExitLoop
    GUIDelete()
    Case $btnCalc

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

    GUICtrlSetData($labelDateError, "")
    GUICtrlSetData($labelTimeError, "")
    GUICtrlSetData($labelNameError, "")
    GUICtrlSetData($labelTimeLeft, "")

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

    $inputDateData = readInputDate($inputDate)
    $inputTimeData = readInputTime($inputTime)
    $inputNameData = readInputName($inputName)

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

    $checkInputDate = checkInputDate($inputDateData)
    If $checkInputDate = 0 Then
    GUICtrlSetData($labelDateError, "Falsche Eingabe: Format TT.MM.JJJJ")
    EndIf

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

    $checkInputTime = checkInputTime($inputTimeData)
    If $checkInputTime = 0 Then
    GUICtrlSetData($labelTimeError, "Falsche Eingabe: Format HH:MM")
    EndIf

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

    $checkInputName = checkInputName($inputNameData)
    If $checkInputName = 0 Then
    GUICtrlSetData($labelNameError, "Bitte nur Buchstaben!")
    EndIf

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

    If $checkInputDate = 1 And $checkInputTime = 1 And $checkInputName = 1 Then

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

    $timeUntilNextEvent = calcTimeToNextEvent($inputDateData, $inputTimeData)
    refreshLabel($inputNameData, $labelTimeLeft, $timeUntilNextEvent)
    ;$timer = _Timer_SetTimer($gui, 10, 'setCountInLabelTimeLeft')
    ;startCounterInLabelTimeLeft($gui)
    EndIf

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

    EndSwitch
    WEnd

    [/autoit]

    Ich bin mit meinem Latein am Ende, für Hilfe wäre ich dankbar!

  • Hallo shingshing,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    Poste doch bitte ein (bis auf das Problem) lauffähiges Beispiel, damit man sich nicht selbst noch die Gui dazu basteln muss.
    Ich persönlich nehme für soetwas

    [autoit]

    AdlibRegister

    [/autoit]

    ,

    mfg autoBert

  • Hallo! Die Hilfe ist schon mein bester Freund, mit ihr arbeite ich auch oft. Nur diesmal finde ich da nichts, was mein Problem löst.

    Das Beispielskript:

    Spoiler anzeigen


    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <Timers.au3>

    Global $iMemo

    _Example_CallBack()

    Func _Example_CallBack()
    Local $hGUI, $iTimer1

    $hGUI = GUICreate("My Timers Using CallBack Function(s)", 400, 300)
    $iMemo = GUICtrlCreateEdit("", 2, 32, 396, 226, BitOR($WS_HSCROLL, $WS_VSCROLL))
    GUISetState(@SW_SHOW)

    $iTimer1 = _Timer_SetTimer($hGUI, 1000, "_TimerCallBackFunc1")

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    EndFunc ;==>_Example_CallBack

    Func _TimerCallBackFunc1($hWnd, $Msg, $iIDTimer, $dwTime)

    $test = 1 & @CRLF

    GUICtrlSetData($iMemo, $test, 1)

    EndFunc ;==>_TimerCallBackFunc1

    Func wertVonHier()
    ;in Meiner richtigen Funktion werden Berechnungen angestellt und per Variable zurückgegeben
    ;dies soll nur der Veranschaulichung dienen

    $testzwei = 1

    Return $testzwei

    Endfunc

    Func _Quit()
    Exit
    EndFunc ;==>_Quit

    Es ist das AutoIt Beispiel zu _timer_settimer, was ich ein wenig abgeändert habe. Im Prinzip ist meins aber genauso aufgebaut.

    Ich möchte in der Funktion _TimerCallBackFunc1 den Wert $test aus einer anderen Funktion heraus haben, hier aus der Funktion wertVonHier().

    Die Funktion AdlibRegister schaue ich mir aber mal an. Aber bei dem Teil "...da sie oft ausgeführt wird und während dieser Zeit das Skript pausiert." werde ich stutzig, denn dies ist das eigentliche Problem. Über Sleep funktioniert das genauso, nur das Skript bleibt dann auch in der Zählroutine stecken, ich kann keine anderen Buttons bedienen und wenn ich das Fenster rumziehe, pausiert das Skript.
    Das Konnte ich wie in diesem Beispiel auch alles umgehen, die Ausgabe sollte aber aus einer anderen Funktion kommen.

  • so?

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <Timers.au3>

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

    Global $iMemo, $iMemoData

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

    _Example_CallBack()

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

    Func _Example_CallBack()
    Local $hGUI, $title, $iTimer1, $bAdlibRegister = True ; Auf False setzen, damits mit "_Timer_SetTimer" läuft

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

    $title = "My Timers Using CallBack Function(s)"
    If $bAdlibRegister Then $title = "My Timers Using AdlibRegister"

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

    $hGUI = GUICreate($title, 400, 300)
    $iMemo = GUICtrlCreateEdit("", 2, 32, 396, 226, BitOR($WS_HSCROLL, $WS_VSCROLL))
    GUISetState(@SW_SHOW)

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

    $iMemoData = wertVonHier()
    GUICtrlSetData($iMemo, $iMemoData)

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

    If $bAdlibRegister Then
    AdlibRegister("_AdlibFunc1", 1000)
    Else
    $iTimer1 = _Timer_SetTimer($hGUI, 1000, "_TimerCallBackFunc1")
    EndIf

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _Quit()
    EndSwitch
    WEnd
    EndFunc ;==>_Example_CallBack

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

    Func _TimerCallBackFunc1($hWnd, $Msg, $iIDTimer, $dwTime)
    $iMemoData -= 1
    If $iMemoData >= 0 Then
    GUICtrlSetData($iMemo, $iMemoData)
    Return
    EndIf
    _Timer_KillTimer($hWnd, $iIDTimer)
    EndFunc ;==>_TimerCallBackFunc1

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

    Func _AdlibFunc1()
    $iMemoData -= 1
    If $iMemoData < 0 Then
    AdlibUnRegister("_AdlibFunc1")
    Return
    EndIf
    GUICtrlSetData($iMemo, $iMemoData)
    EndFunc ;==>_AdlibFunc1

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

    Func wertVonHier()
    Return 5
    Endfunc

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

    Func _Quit()
    Exit
    EndFunc ;==>_Quit

    [/autoit]
  • Das Problem bei AdLibRegister ist einfach, dass wenn ich z.B. das Fenster rumziehe, das Skript pausiert. Es soll aber weiterlaufen, während man andere Sachen damit macht.

    Wie hier:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <Timers.au3>

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

    Global $iMemo

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

    _Example_CallBack()

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

    Func _Example_CallBack()
    Local $hGUI, $iTimer1

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

    $hGUI = GUICreate("My Timers Using CallBack Function(s)", 400, 300)
    $iMemo = GUICtrlCreateEdit("", 2, 32, 396, 226, BitOR($WS_HSCROLL, $WS_VSCROLL))
    GUISetState(@SW_SHOW)

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

    $iTimer1 = _Timer_SetTimer($hGUI, 1000, "_TimerCallBackFunc1")
    ;AdlibRegister("_TimerCallBackFunc1", 1000)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    EndFunc ;==>_Example_CallBack

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

    Func _TimerCallBackFunc1($hWnd, $Msg, $iIDTimer, $dwTime)

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

    $test = 1 & @CRLF

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

    GUICtrlSetData($iMemo, $test, 1)

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

    EndFunc ;==>_TimerCallBackFunc1

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

    Func _Quit()
    Exit
    EndFunc ;==>_Quit

    [/autoit]

    Dort kann man das Fenster rumschieben oder alternativ, wenn ein Button im Skript ist, ihn betätigen und das Skript läuft trotzdem weiter. Und soweit ich erkennen konnte, ist dafür _timer_settimer verantwortlich. mit AdLibregister klappt das nicht.
    Ich glaube mein Anliegen ist noch nicht ganz klar geworden. /: Ich möchte das Skript bedienen, den Button zur Berechnung und Ausgabe betätigen, während das Skript aber runterzählt evtl andere Werte eintragen und den Button erneut bedienen können.

  • Hast du in meinem Beispiel "$bAdlibRegister" schon auf "False" gesetzt?

    Ändere das hier

    [autoit]

    $bAdlibRegister = True

    [/autoit]


    zu dem hier

    [autoit]

    $bAdlibRegister = False

    [/autoit]
    • Offizieller Beitrag

    Das Beispielscript zu _TimerSetTimer funzt doch. Wo ist jetzt das Problem? Sollen wir dir eine Lösung für dein Runterzählproblem basteln?
    Stell lieber mal dein Scipt oder zumindest das was du versucht hast ein und erzähl uns wo es hängt.