Execute Timer

  • Hi, hier mal ein kleines Script von mir.
    Es ist ein Timer, der läuft runter, und wenn er fertig ist, führt er eine Aktion aus.

    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.0.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinApi.au3>
    #include <Timers.au3>
    #include <Sound.au3>
    #include <constants.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('TrayAutoPause', 0)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)
    Opt('GUIEventOptions', 1)

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

    Global $Abbrechen = False, $running = false, $pause = false
    Global $Time, $timer, $ptime, $pausetime = 0
    Global $End, $Resize

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

    Global $Form1, $Group1, $Shutdown, $PlaySound, $RUN, $Group2, $Label1, $Hours, $Label2, $mins, $StartPause, $CancelQuit, $Progress1, $Group3, $Path, $Durchsuchen, $nMsg
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Timer", 410, 296, 192, 124)
    $Group1 = GUICtrlCreateGroup("Aktion", 232, 16, 153, 105)
    $Shutdown = GUICtrlCreateRadio("Herunterfahren", 248, 32, 121, 17)
    $PlaySound = GUICtrlCreateRadio("Sound abspielen", 248, 56, 129, 25)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $RUN = GUICtrlCreateRadio("Script/Anwendung/CMD-Command Ausführen", 248, 88, 105, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Zeit", 16, 16, 153, 105)
    $Label1 = GUICtrlCreateLabel("Stunden:", 32, 40, 47, 17)
    $Hours = GUICtrlCreateInput("", 88, 40, 49, 21, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
    $Label2 = GUICtrlCreateLabel("Minuten", 32, 80, 42, 17)
    $mins = GUICtrlCreateInput("", 88, 80, 49, 21, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $StartPause = GUICtrlCreateButton("Start", 96, 248, 89, 25, $WS_GROUP)
    $CancelQuit = GUICtrlCreateButton("Beenden", 204, 248, 97, 25, $WS_GROUP)
    $Progress1 = GUICtrlCreateProgress(24, 208, 353, 25)
    $Group3 = GUICtrlCreateGroup("Pfad/Befehl", 16, 136, 369, 57)
    $Path = GUICtrlCreateInput("", 24, 160, 273, 21)
    $Durchsuchen = GUICtrlCreateButton("Durchsuchen", 304, 160, 73, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    TraySetClick ( 8 )
    $End = TrayCreateItem("Beenden")
    $Resize = TrayCreateItem("Wiederherstellen")
    TrayItemSetOnEvent($End, "End")
    TrayItemSetOnEvent($Resize, "Anzeigen")
    TraySetOnEvent($TRAY_EVENT_PRIMARYDOWN, "Anzeigen")
    TraySetOnEvent($TRAY_EVENT_MOUSEOVER, "CreateTooltip")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $GUI_EVENT_MINIMIZE
    GUISetState(@SW_HIDE, $Form1)
    Case $StartPause
    runTimer()
    Case $CancelQuit
    Exit
    Case $Durchsuchen
    Durchsuchen()
    EndSwitch
    WEnd

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

    Func runTimer()

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

    GUICtrlSetData($StartPause, "Pause")
    GUICtrlSetData($CancelQuit, "Abbrechen")

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

    $Time = GUICtrlRead($Hours)*3600 + GUICtrlRead($mins)*60
    $timer = _Timer_Init()
    $running = true
    $pausetime = 0

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

    while(((_Timer_Diff($timer)/1000)-$pausetime) < $time)
    GUICtrlSetData($Progress1, (((_Timer_Diff($timer)/1000)-$pausetime)/$time)*100 )

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

    $nMsg = GUIGetMsg()

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

    Switch $nMsg
    Case $StartPause
    Pause()
    if($Abbrechen == true) then
    $Abbrechen = false
    Return
    EndIf

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

    Case $CancelQuit
    GUICtrlSetData($StartPause, "Start")
    GUICtrlSetData($CancelQuit, "Beenden")
    GUICtrlSetData($Progress1, 0)
    $running = false
    Return

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

    Case $GUI_EVENT_CLOSE
    Exit

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

    case $GUI_EVENT_MINIMIZE
    GUISetState(@SW_HIDE, $Form1)
    EndSwitch
    WEnd
    TimeOver()

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

    EndFunc

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

    Func Pause()
    GUICtrlSetData($StartPause, "Fortsetzen")
    $pause = true
    $ptime = _Timer_Init()

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

    while true
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $StartPause
    GUICtrlSetData($StartPause, "Pause")
    $pausetime += _Timer_Diff($ptime)/1000
    $pause = false
    Return

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

    Case $CancelQuit
    $Abbrechen = true
    GUICtrlSetData($StartPause, "Start")
    GUICtrlSetData($CancelQuit, "Beenden")
    GUICtrlSetData($Progress1, 0)
    $running = false
    Return

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

    Case $GUI_EVENT_CLOSE
    Exit

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

    case $GUI_EVENT_MINIMIZE
    GUISetState(@SW_HIDE, $Form1)
    EndSwitch
    WEnd

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

    EndFunc

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

    Func Durchsuchen()
    local $Ret = _WinAPI_GetOpenFileName("Wähle eine Datei", "Alle Dateien (*.*)", @HomeDrive)
    if($Ret[0] <> 0) Then
    GUICtrlSetData($Path, $Ret[1]&"\"&$Ret[2])
    EndIf

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

    EndFunc

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

    Func TimeOver()

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

    if(GUICtrlRead($Shutdown) == $GUI_CHECKED) Then
    Shutdown(5)
    ElseIf(GUICtrlRead($PlaySound) == $GUI_CHECKED)Then
    _SoundPlay(_SoundOpen(GUICtrlRead($Path)))
    if(@error == 1) Then
    MsgBox(0, "Timer", "Konnte Sound nicht abspielen."&@CRLF&"Möglicherweise nicht vorhanden, oder ungültiges Format?")
    EndIf
    ElseIf(GUICtrlRead($RUN) == $GUI_CHECKED)Then
    Run(GUICtrlRead($Path))
    EndIf

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

    GUICtrlSetData($StartPause, "Starten")
    GUICtrlSetData($CancelQuit, "Beenden")
    GUICtrlSetData($Progress1, 0)
    $running = false

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

    EndFunc

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

    Func Anzeigen()
    GUISetState(@SW_SHOW, $Form1)
    EndFunc

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

    Func End()
    Exit
    EndFunc

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

    Func CreateTooltip()
    local $nachricht
    local $StayedTime
    local $title

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

    if($running == true And $pause == false) then
    $title = "Verbleibende Zeit:"
    $StayedTime = $Time - _Timer_Diff($timer)/1000 + $pausetime
    elseif($pause == true and $running == true) Then
    $title = "Pausiert - Verbleibende Zeit:"
    $StayedTime = $Time - _Timer_Diff($timer)/1000 + _Timer_Diff($ptime)/1000 + $pausetime
    elseif($running == false) then
    $title = "Timer läuft nicht"
    $StayedTime = 0
    EndIf

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

    local $Stunden = Int($StayedTime / 3600)
    local $Minuten = Int(($StayedTime - $Stunden*3600)/60)
    local $Secunden = Int($StayedTime - $Stunden*3600 - $Minuten*60)

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

    $nachricht = $Stunden&":"&$Minuten&":"&$Secunden

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

    TrayTip($title, $nachricht, 1, 1)
    TrayTip("", "", 1)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • hey schon mal nicht schlecht! ^^

    noch ein paar kleine anmerkungen die mir spontan aufgefallen sind:

    -würde aber auch in der Gui ein label machen, welches die verbleibende zeit zeigt
    -Dein TrayTip flackert extremst
    -Script zeigt dem User nicht an, wenn er kein Sound oder kein Programm zum ausführen ausgewählt hat

  • Hm, ich dachte mir das Label ist überflüssig, man hat ja den Tray, der bei mir übrigens nicht flackert...
    Ich denke ich werde integrieren, das der Wert in den Stunden und Minuten - Inputs entsprechend runtergezählt wird.
    Und die Warnung, naja zumindest wenn man auf Sound stellt und nichts eingetragen ist kommt eine. Der Sinn so ist, dass man es bis zum Ende noch ändern kann.

  • Hallo Ryu 1991;

    ganz nett, aber mir sind noch einige Bugs aufgefallen:

    • Wenn man 0,5 für Minuten eingeben will kommt gleich nach der 0 der Tooltip nicht annehmbares Zeichen, danach wird jede Eingabe (auch Zahlen :!: ) mit Tooltipp nicht annehmbares Zeichen verweigert
    • Wenn man den Timer pausiert hatte und weiter laufen lässt, zählt er ins minus (im TrayToolTip)
    • Der Ladebalken wird nicht immer aktualisiert, bei 1 Minute kann es vorkommen, dass er 20-30 Sekunden wartet bis er aktualisiert wird (bei Wechsel zu fremden Fenster und zurück)

    @ChaosKeks, das Flackern kommt warscheins daher dasRyu ganz ohne sleep in seiner MsgLoop auskommt,

    mfg (Auto)Bert

  • Das man kein Komma eingeben kann ist Absicht. habe das ja als Number-Feld gemacht.
    Das mit dem ins Minus-zählen ist ärgerlich, ich dachte ich hätte das abgestellt, bei zählt er nur 2-3 sekunden ins minus und stellt dann auf kein timer aktiv. (meintest du das)

    Und was den Ladebalken angeht. Ich habe festgestellt, dass der nicht reagiert, während man sich den tooltip anzeigen lässt, aber danach geht er normal weiter.
    Um das zu beheben hätte ich gerne 2 threads verwendet, allerdings habe ich noch nicht rausgefunden wie das in AutoIt geht.
    Wenn er beim wechseln von Fenstern hängt, kann ich mir das leider auch nicht erklären. (ihr vielleicht? ?( )

    gruß Ryu

  • Hallo Ryu 1991,

    Zitat

    Das mit dem ins Minus-zählen ist ärgerlich, ich dachte ich hätte das abgestellt, bei zählt er nur 2-3 sekunden ins minus und stellt dann auf kein timer aktiv. (meintest du das)

    Ja, das meinte ich nu das es nicht nur 2-3 sec. sind, einmal ist er sogar wieder auf 60 gesprungen und hat von wieder von vorne angefangen,

    mfg (Auto)bert