Timer umbauen - wer kann mir das erklären?

  • hiho,

    also ich wollte ja so ein kleiens shutdown tool bauen, dass über die cmd angesprochen wird. der shutdown soll in verschiedenen modi aufgerufen werden können.

    zb.:
    -s -t 14:45 (uhrzeit)
    -s -h 2 (stunden)
    -s -m 45 (minuten)
    -s -s 90 (sekunden)

    nun habe ich diesen code von (ich hoffe ich lüg nicht) th.meger erhalten.
    diesen wollte ich nun umbauen. also eigentlich 4 verschiedene countdowns basteln, in denen halt die 4 verschiedenen parameter oben runtergezählt werden. jetzt müsste ich nur den countdown richtig verstehen, um ihn umschreiben zu können, bis jetzt hat es aber noch nicht geklappt.
    habe mir in der hilfe die themen zu timerinit, round, stringformat und datediff angeguckt (stringformat hab ich irgendwie nix von verstanden) ... aber vllt kann mir von euch kurz helfen dass zu verstehen und umzubauen, so dass er z.b. bei -s -s 90, 90 sek. wartet, bis er was ausführt.

    [autoit]

    Func _countDown($Countdown)
    $begin = TimerInit()
    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 & " Sek. bis Script fortgeführt wird, klicken Sie <ESC> falls die Seite fertig geladen ist")
    WEnd
    EndFunc

    [/autoit]
  • billige lösung, aber funkt:

    wie man parameter bekommt weisst du ja (wenn nicht, so:


    #include <Array.au3>

    If $cmdline[0] > 0 Then



    MsgBox(0, "", $cmdline[1])
    EndIf


    )


    So ein aufruf lautet zb... timer.exe -s -t 14:00


    [autoit]


    #include <Array.au3>

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

    If $cmdline[0] > 0 Then

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

    $first = StringLeft($cmdline[1], "2")
    $second = StringLeft($cmdline[2], "2")
    $third = StringLeft($cmdline[3], "5")

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

    ;MsgBox(0, "", $left)

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

    ;MsgBox(0, "", $first & " " & $second & " " & $third)

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

    $command = $first & " " & $second & " " & $third

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

    EndIf

    [/autoit]

    mfg...


    das ganze kannst du jetzt selber auch für die anderen (-h, -m, -s) machen, und über sleep oder eben timer diff dann verarbeiten.


    $command is einfach die gesamte Kommandozeilenparamater..

    Die eingegeben zeit ist im beispiel als $third gespeichert :D

    2 Mal editiert, zuletzt von huggy (16. Mai 2007 um 14:26)

  • hello

    also ich bin noch in der konzeptphase.
    hab erstmal so brainstorming-artig runtergeschrieben, wie es gehen soll ... bin mir aber noch net sicher ob es auch geht *g*

    auf ein gui will ich eigentlich verzichten.
    es ist eigentlich ähnlich wie die shutdown.exe.

    wenn man den pc herunterfahren will, gibt man auf cmd-ebene den befehl ein "sd.exe -s -m 60 ein"

    als erstes wird geprüft, ob parameter 1 existiert, wenn ja, wird aufgrund von parameter 2 entschieden, in welche countdown-funktion er springen soll (sind 4 verschiedene, sieht man immer am letzten buchstaben).
    dann wird der timer runtergezählt und danach nochmal übergeben, welcher befehl für parameter 1 vergesehen ist.
    danach wird der shutdown befehl ausgeführt.

    ob der ablauf in sich so ganz schlüssig ist, weiss ich wie gesagt noch nicht (bzw zu kompliziert ist). wollte jetzt die countdown-funktionen basteln.

    für ideen zum restlichen script bin ich natürlich auch dankbar, weil ich denke, dass es so irgendwie voll umständlich ist, aber das viel mir gestern abend als erstes ein =)

    Spoiler anzeigen
    [autoit]


    #include <date.au3>

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

    HotKeySet("{End}", "_kill")

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

    If $CmdLine[0] > 0 Then
    Call("_If")
    Else
    MsgBox(16, 'Fehler', "Kein Parameter angegeben")
    EndIf

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

    Func _If()
    Select
    Case $CmdLine[2] = "-t"
    If _countDownt($Countdown) Then Call("_End")
    Case $CmdLine[2] = "-h"
    If _countDownh($Countdown) Then Call("_End")
    Case $CmdLine[2] = "-m"
    If _countDownm($Countdown) Then Call("_End")
    Case $CmdLine[2] = "-s"
    If _countDowns($Countdown) Then Call("_End")
    Case Else
    MsgBox(16, 'Fehler', "Falsche Parameter verwendet")
    EndSelect
    EndFunc

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

    Func _countDownt($Countdown)
    Local $string = ""
    While 1
    $countUp = StringFormat("%.02d", _
    Mod($Countdown, 60))
    $sec = _DateDiff('s', "2006/01/01 " & $countUp, "2006/01/01 " & $Countdown)
    If $sec = 0 Then Return 1
    $string = StringFormat("%.02d", _
    Mod($sec, 60))
    ToolTip($string & " Sek. bis runtergefahren wird")
    WEnd
    EndFunc

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

    Func _End()
    Select
    Case $CmdLine[1] = "-l"
    MsgBox(0, "", "(@comspec & ' /c shutdown -l -f -c ' & $CmdLine[4]")
    Case $CmdLine[1] = "-s"
    MsgBox(0, "", "Run(@comspec & ' /c shutdown -s -f -c ' & $CmdLine[4]")
    Case $CmdLine[1] = "-r"
    MsgBox(0, "", "Run(@comspec & ' /c shutdown -r -f -c ' & $CmdLine[4]")
    Case Else
    MsgBox(16, 'Fehler', "Falsche Parameter verwendet")
    EndSelect
    EndFunc

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

    Func _kill()
    Exit
    EndFunc

    [/autoit]
  • $countdown ist $cmdline[3]
    wie gesagt, is ja noch im anfang =)

    sleep lastet doch die cpu aus, wenn ich dann nen countdown von 3 h habe, geht der ziemlich in die knie.

    ich will ja nicht unbedingt die shutdown.exe neu schreiben, nur vereinfachen, bzw an meine wünsche anpassen.

    ich will da freie wahl haben, ob ich ne uhrzeit, stunden, minuten oder sekunden angebe.
    dazu soll dann auch irgendwie der countdown angezeigt werden, im tool- oder traytip.

    die frage ist nur, wie rechnet die funktion oben mir 40 sek runter (so dass ich nicht 00:00:40 eingeben muss, sondern nur -s 40)

    • Offizieller Beitrag

    Hallo!

    Ich benutze als Ersatz für shutdown.exe immer das Freewaretool PowerOff Dieses Tool ist um einiges mächtiger als shutdown und wenn es mit Parametern aufgerufen wird, wird auch keine GUI angezeigt. Mit -h bekommt man alle möglichen Paramter angezeigt!

    Edit:

    Übrigens der Sleep-Befehl belastet nicht die CPU sondern entlastet sie!!!

  • ich bin mir klar, was ich machen will. es geht sich hier auch nicht um das tool selber, was ich schreiben will, sondern einfach nur, dass ich die countdown funktion so anpassen möchte, dass dort zb nur 156 sek. runtergezählt werden.

    mit sleep geht es, aber davon bekomme ich keinen tooltip.

    also.

    Spoiler anzeigen
    [autoit]


    Func _countDown($Countdown)
    $begin = TimerInit()
    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 & " Sek. bis Script fortgeführt wird, klicken Sie <ESC> falls die Seite fertig geladen ist")
    WEnd
    EndFunc

    [/autoit]

    aus diese funktion, in der man den countdown in 24:59:59 angibt, hätte ich gerne einen countdown, der eine zahl die ich eingebe, nur als sekunden im timer verarbeitet und runterzählt.

    PS: ich habe es schon soweit modifiziert, dass ich einen aufruf von -s -s 50 also sekunden countdown runterrechnen kann, aber leider würde -s -s 156 nicht gehen, da dort max 59 sek. eigegeben werden können.

    kann mir jetzt jmd helfen ? *liebguck*

    • Offizieller Beitrag

    Nur Sekunden runterzählen kannst du so machen:

    [autoit]

    #include <Date.au3>
    _countDown(156)

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

    Func _countDown($Countdown)
    $end = _DateAdd('s', $Countdown, _NowCalc())
    Do
    Sleep(100)
    $sec = _DateDiff('s', _NowCalc(), $end)
    ToolTip($sec & ' sec')
    Until $sec = 0
    EndFunc

    [/autoit]

    Edit: Oder hier eine Version, in der du das Include sparst:

    [autoit]

    _CountDown(156)

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

    Func _CountDown($SEC)
    Local $begin = TimerInit(), $diff
    Do
    $diff = TimerDiff($begin)
    ToolTip("Noch " & Round(($SEC*1000 -$diff)/1000) & " Sekunden",Default,Default,"Countdown")
    Sleep(100)
    Until $diff >= $SEC*1000
    EndFunc

    [/autoit]