Countdown Funktion

  • Hallo :)

    ich habe mir eine Countdown Funktion gebastelt :) Dieser übergeb ich ein Zahl an Sekunnden beispielweise 3670 Sekunden. Die Funktion soll dann eine Message zurück geben wie "1 Stunde 1 Minute und 10 Sekunden" und halt runterzählen.
    Aber meine Funktion gibt nur "0 Sekunden verbleibend" zurück! :| Kann mal jemand den Code checken?

    [autoit]


    Func Countdown($Sec)

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

    $Htime = Int($Sec / 3600)
    $Mtime = Int(($Sec - ($Htime*3600)) / 60)
    $Stime = Int(($Sec - ($Htime*3600)) - ($Mtime*60))

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

    ; Hour Or Hours
    If $Htime = 1 Then
    $Case1 = "Stunde"
    Else
    $Case1 = "Stunden"
    EndIf

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

    ; Minute Or Minutes
    If $Mtime = 1 Then
    $Case2 = "Minute"
    Else
    $Case2 = "Minuten"
    EndIf

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

    ; Hour Or Hours
    If $Stime = 1 Then
    $Case3 = "Sekunde"
    Else
    $Case3 = "Sekunden"
    EndIf

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

    If $Htime > 0 Then
    $Message = StringFormat("%d "& $Case1 &" %d "& $Case2 &" %d "& $Case3 &" verbleibend", $Htime, $Mtime, $Stime)

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

    ElseIf $Htime < 0 And $Mtime > 0 Then
    $Message = StringFormat("%d "& $Case2 &" %d "& $Case3 &" verbleibend", $Mtime, $Stime)

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

    ElseIf $Htime < 0 And $Mtime < 0 And $Stime > 0 Then
    $Message = StringFormat("%d "& $Case3 &" verbleibend", $Stime)
    Else
    $Message = StringFormat("%d "& $Case3 &" verbleibend", 0)
    EndIf

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

    Return $Message

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

    EndFunc

    [/autoit]

    Jetzt hab noch ein, Frage:
    Die Sekunden sollen heruntergezählt werden. Was ist jetzt besser?
    1. ich übergebe der Funktion die Zahl 3600 und mach eine Schleife in der ich die Sekunden herunterzähle und immer mittels GUICtrlSetData() immer die Nachricht neu ersetzte oder
    2. Ich mache ausserhalb der Funktion eine Schleife wo ich die Sekunden herunterzähle und die Funktion dann immer neu aufrufe mit den Sekunden.

    Was ist jeztz besser?

  • Hier mal drei einfach Lösungen.
    Du kannst ja mal schauen was Du davon brauchst.
    No. 1:

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>

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

    $sekunden = 3760
    $Stunden = Int($sekunden / 3600)
    $Minuten = Int(($sekunden - ($Stunden * 3600))/60)
    $Sekunden = Int((($sekunden - ($Stunden * 3600)) - ($Minuten * 60)))

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

    ;MsgBox(0,"", $Stunden & " : " & $Minuten & " : " & $Sekunden)
    $cd = $Stunden & ":" & $Minuten & ":" & $Sekunden

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

    If _countDown($cd) Then MsgBox(0, "Countdown", "ENDE") ; SS:MM:SS

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

    Func _countDown($countdown)
    $begin = TimerInit()

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

    Local $string = ""

    While 1
    $start = Round(TimerDiff($begin) / 1000)

    $countUp = StringFormat("%.02d" & ":" & "%.02d" & ":" & "%.02d", _
    Mod($start / 3600, 24), Mod(($start / 60), 60), Mod($start, 60))

    $sec = _DateDiff('s', "2006/01/01 " & $countUp, "2006/01/01 " & $countdown)
    If $sec = 0 Then Return 1

    $string = StringFormat("%.02d" & " : " & "%.02d" & " : " & "%.02d", _
    Mod($sec / 3600, 24), Mod(($sec / 60), 60), Mod($sec, 60))

    ToolTip($string)
    sleep(100)
    WEnd
    EndFunc ;==>_countDown

    [/autoit]


    No. 2:

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>

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

    $sekunden = 3760
    $Stunden = Int($sekunden / 3600)
    $Minuten = Int(($sekunden - ($Stunden * 3600))/60)
    $Sekunden = Int((($sekunden - ($Stunden * 3600)) - ($Minuten * 60)))

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

    ;MsgBox(0,"", $Stunden & " : " & $Minuten & " : " & $Sekunden)
    $cd = $Stunden & ":" & $Minuten & ":" & $Sekunden

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

    If _countDown($cd) Then MsgBox(0, "Countdown", "ENDE") ; SS:MM:SS

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

    Func _countDown($countdown)
    $begin = TimerInit()

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

    Local $string = ""

    While 1
    $start = Round(TimerDiff($begin) / 1000)

    $countUp = StringFormat("%.02d" & ":" & "%.02d" & ":" & "%.02d", _
    Mod($start / 3600, 24), Mod(($start / 60), 60), Mod($start, 60))

    $sec = _DateDiff('s', "2006/01/01 " & $countUp, "2006/01/01 " & $countdown)
    If $sec = 0 Then Return 1

    $string = StringFormat("%.02d" & ":" & "%.02d" & ":" & "%.02d", _
    Mod($sec / 3600, 24), Mod(($sec / 60), 60), Mod($sec, 60))

    MsgBox(0,"Timer", $string,1)
    ;ToolTip($string)

    WEnd
    EndFunc ;==>_countDown

    [/autoit]


    No. 3:

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>

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

    $sekunden = 3760
    $Stunden = Int($sekunden / 3600)
    $Minuten = Int(($sekunden - ($Stunden * 3600))/60)
    $Sekunden = Int((($sekunden - ($Stunden * 3600)) - ($Minuten * 60)))

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

    ;MsgBox(0,"", $Stunden & " : " & $Minuten & " : " & $Sekunden)
    $cd = $Stunden & ":" & $Minuten & ":" & $Sekunden

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

    If _countDown($cd) Then MsgBox(0, "Countdown", "ENDE") ; SS:MM:SS

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

    Func _countDown($countdown)
    $begin = TimerInit()

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

    Local $string = ""

    While 1
    $start = Round(TimerDiff($begin) / 1000)

    $countUp = StringFormat("%.02d" & ":" & "%.02d" & ":" & "%.02d", _
    Mod($start / 3600, 24), Mod(($start / 60), 60), Mod($start, 60))

    $sec = _DateDiff('s', "2006/01/01 " & $countUp, "2006/01/01 " & $countdown)
    If $sec = 0 Then Return 1

    $string = StringFormat("Stunden: "& "%.02d" & " Minuten: " & "%.02d" & " Sekunden: " & "%.02d", _
    Mod($sec / 3600, 24), Mod(($sec / 60), 60), Mod($sec, 60))

    MsgBox(0,"Timer", $string,1)
    ;ToolTip($string)
    WEnd
    EndFunc ;==>_countDown

    [/autoit]

    Alle sind ein wenig anders als der davor. Einfach testen. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Genial! :) Vielen Dank :)
    Aber der Code klappt zwar perfekt aber ich versteh nicht genau wie er geht :rolleyes: Zum Beispiel das mit TimerInit undsoo? Bin noch nicht soo gut in AutoIt.

  • @zer0

    Lese die Hilfe und wenn Fragen sind, wir sind ein Forum und hier helfen wir gerne. Also freundlich fragen und zeigen das Du selber lernen möchtest.

    TimerInit ist in der Hilfe gut erklärt.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Ja natürlich habe ich in der Helpfile schon nachgelesen! Aber trotzdem versteh ich immernoch nicht was das genau macht bzw für was das in der Countdown Funktion da ist? ?(

  • Hallo zero,
    ich möchte dir nicht zu nahe treten, aber bei den meisten Funktionen kann man schon am Namen erkennen um was es geht.

    TimerINIT() -> ein Timer ( Time=Zeit Timer=Zeitherausfinder) wird INITialisiert (vorbereitet,eingeleitet) d.h. zum Zeitpunkt des Timerinit guckt der kleine Chinese, der in deinem Rechner in der Zeitermittlungsabteilung sitzt, auf seine Uhr und weil der Chinese sehr vergesslich ist, schreibt er diese Zeit auf einen Zettel ( ich würde ja in eine Variable speichern, zum Beispiel $startzeit, aber naja...)

    TimerDIFF() -> ein Timer (auch ein Zeitherausfinder) soll die ZeitDIFFerenz (Unterschied) zu einer vorher eingeleiteten (initialisierten) Zeit feststellen. Also guckt ein weiterer kleiner Chinese ganz schnell auf seine Uhr und schreibt die ZeitDIFFerenz von der aktuellen Zeit und der aufgeschriebenen Zeit auf dem Zettel auf. Ich würde ja wiederum in eine Variable schreiben, z.b. $differenzzeit, aber naja....

    Und wie funktioniert nun das Programm?
    Na ganz einfach, der erste Chinese schreibt die TimerINIT()- Zeit auf. Nun erhält der zweite Chinese in der TimerDIFF()-Abteilung folgende Anweisung: Rechne permanent die DIFFerenz zur INITzeit aus, und sobald dieser Zeitunterschied vier Stunden ist, brüllst du STOP!

    Das führt zu einigen Fragen...
    Warum sitzen im Rechner Chinesen?
    1. Es gibt sehr viele davon!
    2. Chinesen können sehr schnell rechnen.
    3. Chinesen führen eine Anweisung aus!
    4. Chinesen sind sehr geduldig und es macht ihnen nichts aus lange zu warten.
    5. Chinesen konzentrieren sich auf ihre Aufgabe.
    6. Chinesen sind intelligent und machen das was sie gesagt bekommen.

    Eine weitere Frage die sich stellt:
    Warum soll der Chinese nach vier Stunden STOP brüllen?
    - ganz einfach, dann ist Mittagspause :rofl:

    ciao
    Andy

  • Ok. :) Aber ein Problem habe ich jetzt noch, während der Countdown läuft muss ich den "Abbrechen" Button der GUI drücken können und der Countdown hört auf der Start-Button wird wieder Aktiviert.
    Das klappt auch eig soweit. Aber sobald der Countdown (also die Funktion) gestartet ist nichtmehr.
    Was auch nicht geht ist während des Countdowns X zudrücken und das Script zubeenden.

    Das hier ist mein Ansatz:

    [autoit]


    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Start
    ; Buttons aktivieren/deaktivieren
    GUICtrlSetState($Start, $GUI_DISABLE)
    GUICtrlSetState($Cancel, $GUI_ENABLE)

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

    ...

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

    If _CountDown($cd) Then
    MsgBox(0, "Countdown", "ENDE")
    EndIf

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

    Case $Cancel
    ; Buttons aktivieren/deaktivieren
    GUICtrlSetState($Start, $GUI_ENABLE)
    GUICtrlSetState($Cancel, $GUI_DISABLE)
    EndSwitch
    WEnd
    ...
    Func _countDown($countdown)
    ...
    EndFunc

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

    Ich denk ich muss innerhalb der Funktion überprüfen ob Abbrechen gedrückt wurde und dann soll wieder in den Status versetzt werden bevor Start gedrückt wurde. Aber wie?

    Einmal editiert, zuletzt von zer0 (19. August 2009 um 12:33)

    • Offizieller Beitrag

    Du könntest innerhalb der Countdows Funktion das drücken des Buttons abfragen. Stichwort GUIGetMsg. Kannst aber auch mal dein komplettes Script posten, dann kann man da bestimmt weiterhelfen.

  • Klar :) Hier ist es.

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <GUIConstants.au3>
    #include <Date.au3>
    #include <Math.au3>
    #include <Constants.au3>

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

    HotKeySet("{ESC}", "Terminate") ; danach entfernen !!

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

    Opt("TrayMenuMode",1)
    Global $TrayShow = TrayCreateItem('Anzeigen')
    Global $TrayExit = TrayCreateItem('Beenden')
    TraySetClick(16)

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

    Global $GlobalDate = @YEAR &"/"& @MON &"/"& @MDAY

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

    #Region GUI
    $GUI = GUICreate("Shutdown Manager", 243, 318, 193, 115)
    $Start = GUICtrlCreateButton("Start", 8, 288, 89, 25, 0)
    $Cancel = GUICtrlCreateButton("Abbrechen", 144, 288, 89, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Group1 = GUICtrlCreateGroup("Zeit", 8, 16, 225, 73)
    $Time = GUICtrlCreateDate("", 149, 56, 74, 21, BitOR(0x01, 0x09, 0x00010000))
    $Date = GUICtrlCreateDate("", 16, 56, 83, 21, 0x00010000)
    $LabelDate = GUICtrlCreateLabel("Datum", 16, 40, 83, 17)
    $LabelTime = GUICtrlCreateLabel("Uhrzeit", 149, 40, 37, 17)
    $Group2 = GUICtrlCreateGroup("Optionen", 8, 104, 225, 121)
    GUIStartGroup()
    $Force = GUICtrlCreateCheckbox("Herunterfahren erzwingen", 16, 200, 209, 17)
    $Shutdown = GUICtrlCreateRadio("Herunterfahren", 16, 128, 209, 17)
    $Reboot = GUICtrlCreateRadio("Neustart", 16, 144, 209, 17)
    $Logoff = GUICtrlCreateRadio("Abmelden ", 16, 160, 209, 17)
    $Sleep = GUICtrlCreateRadio("Ruhezustand", 16, 176, 209, 17)
    $Info = GUICtrlCreateLabel("", 56, 256, 124, 20)

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

    GUISetState(@SW_SHOW)
    #EndRegion GUI

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

    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE ; Schließen
    Exit
    Case $GUI_EVENT_MINIMIZE ; Minimieren
    Minimize()

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

    Case $Start
    ; Buttons aktivieren/deaktivieren
    GUICtrlSetState($Start, $GUI_DISABLE)
    GUICtrlSetState($Cancel, $GUI_ENABLE)
    ; Input deaktivieren
    GUICtrlSetState($Date, $GUI_DISABLE)
    GUICtrlSetState($Time, $GUI_DISABLE)
    GUICtrlSetState($Force, $GUI_DISABLE)
    GUICtrlSetState($Shutdown, $GUI_DISABLE)
    GUICtrlSetState($Reboot, $GUI_DISABLE)
    GUICtrlSetState($Logoff, $GUI_DISABLE)
    GUICtrlSetState($Sleep, $GUI_DISABLE)

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

    $t = GUICtrlRead($Time)
    $d = GUICtrlRead($Date)

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

    $String = $d & " " & $t
    $FormatDate = StringRegExpReplace($String, "(\d*).(\d*).(\d*) (\d*:\d*:\d*)", "$3/$2/$1 $4")
    $OnlyDate = StringRegExpReplace($d, "(\d*).(\d*).(\d*)", "$3/$2/$1")
    $Seconds = _DateDiff("s", _NowCalc(), $FormatDate)

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

    If _CountDown($OnlyDate, $Seconds, $Info) Then
    MsgBox(0, "Countdown", "ENDE")
    ; Welcher Radiobutton wurde ausgewählt?
    Switch 1
    Case isChecked($Shutdown)
    MsgBox(0, "Countdown", "shutdown")
    If isChecked($Force) Then
    Shutdown(5) ; 1 Herunterfahren + 4 Erzwingen
    Else
    Shutdown(1)
    EndIf
    Case isChecked($Reboot)
    MsgBox(0, "Countdown", "reboot")
    If isChecked($Force) Then
    Shutdown(6) ; 2 Herunterfahren + 4 Erzwingen
    Else
    Shutdown(2)
    EndIf
    Case isChecked($Logoff)
    MsgBox(0, "Countdown", "logoff")
    Shutdown(0) ; Abmelden
    Case isChecked($Sleep)
    MsgBox(0, "Countdown", "sleep")
    Shutdown(64) ; Ruhezustand
    EndSwitch
    EndIf

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

    Case $Cancel
    ; Buttons aktivieren/deaktivieren
    GUICtrlSetState($Start, $GUI_ENABLE)
    GUICtrlSetState($Cancel, $GUI_DISABLE)
    ; Input aktivieren
    GUICtrlSetState($Date, $GUI_ENABLE)
    GUICtrlSetState($Time, $GUI_ENABLE)
    GUICtrlSetState($Force, $GUI_ENABLE)
    GUICtrlSetState($Shutdown, $GUI_ENABLE)
    GUICtrlSetState($Reboot, $GUI_ENABLE)
    GUICtrlSetState($Logoff, $GUI_ENABLE)
    GUICtrlSetState($Sleep, $GUI_ENABLE)
    GUICtrlSetData($Info, "")
    EndSwitch
    WEnd

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

    Func _CountDown($Date, $sekunden, $GUIid)
    $Stunden = Int($sekunden / 3600)
    $Minuten = Int(($sekunden - ($Stunden * 3600))/60)
    $Sekunden = Int((($sekunden - ($Stunden * 3600)) - ($Minuten * 60)))

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

    $cd = $Stunden & ":" & $Minuten & ":" & $Sekunden

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

    $begin = TimerInit()

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

    Local $string = ""

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

    While 1
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit ; Wenn X gedrückt wurde
    If GUIGetMsg() = $GUI_EVENT_MINIMIZE Then Minimize() ; Wenn X gedrückt wurde

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

    $start = Round(TimerDiff($begin) / 1000)

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

    $countUp = StringFormat("%.02d" & ":" & "%.02d" & ":" & "%.02d", _
    Mod($start / 3600, 24), Mod(($start / 60), 60), Mod($start, 60))

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

    $sec = _DateDiff('s', $GlobalDate & " " & $countUp, $Date & " " & $cd)
    If $sec = 0 Then Return 1

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

    If $sec = 30 Then TrayTip("30 Sekunden", "30 Sekunden verbeleibend", 15)

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

    $string = StringFormat("%.02d" & " : " & "%.02d" & " : " & "%.02d", _
    Mod($sec / 3600, 24), Mod(($sec / 60), 60), Mod($sec, 60))

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

    GUICtrlSetData($GUIid, $string)
    Sleep(100)

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

    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit ; Wenn X gedrückt wurde; hier nochmal wegen verzögerung durch Sleep()
    If GUIGetMsg() = $GUI_EVENT_MINIMIZE Then Minimize() ; Wenn X gedrückt wurde
    WEnd
    EndFunc

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

    Func Terminate()
    Exit 0
    EndFunc

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

    Func isChecked($id)
    $checked = GUICtrlRead($id)
    If $checked = $GUI_CHECKED Then
    Return 1
    EndIf
    EndFunc

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

    Func Minimize()
    Opt("TrayIconHide", 0)
    GUISetState(@SW_HIDE, $GUI)
    TrayTip("Minimiert", "Hier bin ich versteckt", 15, 1) ; Tray-Tip anzeigen bei Minimierung

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

    While 1 ; Tray-Menü-Schleife
    $TrayMsg = TrayGetMsg()
    Switch $TrayMsg
    Case $TRAY_EVENT_PRIMARYDOUBLE
    Opt('TrayIconHide', 1)
    GUISetState(@SW_SHOW, $GUI)
    GUISetState(@SW_RESTORE, $GUI)
    ExitLoop
    Case $TrayShow
    Opt('TrayIconHide', 1)
    GUISetState(@SW_SHOW, $GUI)
    GUISetState(@SW_RESTORE, $GUI)
    ExitLoop
    Case $TrayExit
    Exit
    EndSwitch
    WEnd
    EndFunc

    [/autoit]

    Ich habe jetzt in die Countdown Funktion in die While Schleife 2mal Abfragen über den Status der der GUI mit GUIGetMsg() gemacht. Wenn ich Minimierien klicke, minimierts entweder und geht in die Taskleiste (was es ja ned soll) oder es wird wenn ich Glück habe zu einem Tray Icon was richtig wäre.
    Wenn ich X drücke schließt es meistens nur mit verzögerung. Wenn ich Sleep() entferne klappt das Schließen mit X normal, jedoch das Minimieren ist immernoch soo ein Glücksspiel 8|
    Weißt jemand was ich machen kann? ?(