Countdown

  • Ich bin ein absoluter Anfänger und habe mr aus verschiedene Forum alles mögliche zusammengebastelt
    Nun wollte ich mir ein einfaches Shutdown Programm erstellen
    Doch mein Problem ist das der Countdown von der angegeben Zeit immer verschieden schnell abläuft
    weil in dieser Zeitschleife noch verschiedene Abfragen enthalten sind
    wenn ich denn Countdown abbrechen möchte
    Hat irgendjemand eine Idee wie ich das besser realisieren könnte ?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    _Main()

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

    Func _Main()
    Local $Restart, $Shutdown, $StandBy, $LogOff
    Local $Label1, $Label2, $Label3
    Local $Sofort, $Spaeter
    Local $Minuten, $Sekunden, $Form1, $Com, $Her, $Abbrechen, $nMsg
    Global $Zeit, $Main

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

    $Main = GUICreate("EasyShutdown", 264, 250, 356, 180)
    $Minuten=GUICtrlCreateInput("", 8, 200, 57, 21)
    $Sekunden=GUICtrlCreateInput("", 128, 200, 57, 21)

    $Restart = GUICtrlCreateButton("1", 16, 48, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, "shell32.dll", 255)
    $Shutdown = GUICtrlCreateButton("2", 168, 48, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, "shell32.dll", 28)
    $StandBy = GUICtrlCreateButton("3", 16, 112, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, "shell32.dll", 26)
    $LogOff = GUICtrlCreateButton("4", 168, 112, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, "shell32.dll", 45)


    $Label1 = GUICtrlCreateLabel("Minuten", 72, 202, 42, 17)
    $Label2 = GUICtrlCreateLabel("Sekunden", 195, 202, 53, 17)
    $Label3 = GUICtrlCreateLabel("Shutdown Programm by Nimmervoll Thomas", 8, 8, 214, 17)
    $Sofort = GUICtrlCreateRadio("Sofort", 16, 168, 113, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Spaeter = GUICtrlCreateRadio("Später", 130, 168, 113, 17)
    GUISetState(@SW_SHOW)
    GUISetState()

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

    ; Run the GUI until the dialog is closed
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

    Case $Restart

    If GUICtrlRead($Sofort) = 1 Then
    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    Shutdown (2)

    ElseIf GUICtrlRead($Spaeter) = 1 Then

    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    $Form1 = GUICreate("Form1", 230, 80, 1360, 750)
    $Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    $Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetState()
    $Zeit = (GUICtrlRead($Sekunden)*1000 + GUICtrlRead($Minuten)*60000)


    while $Zeit >= 0

    GUICtrlSetData($Her, Round($Zeit/1000 ,0) & "sek heruntergefahren")

    Switch GUIGetMSG()
    Case $GUI_EVENT_Close
    ExitLoop
    Case $Abbrechen
    ExitLoop
    EndSwitch

    Sleep(90)
    $Zeit = $Zeit - 100
    WEnd

    Switch $Zeit

    Case -100
    GUIDelete ($Form1)
    Shutdown (2)

    Case 0.1 to 99999999999
    GUIDelete ($Form1)
    MsgBox(1,"Info","Vorgang durch Benutzer unterbrochen")
    WinSetState($Main,"",@SW_RESTORE)

    EndSwitch

    Else ;
    EndIf

    Case $Shutdown
    If GUICtrlRead($Sofort) = 1 Then
    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    Shutdown (1)

    ElseIf GUICtrlRead($Spaeter) = 1 Then

    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    $Form1 = GUICreate("Form1", 230, 80, 1360, 750)
    $Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    $Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetState()
    $Zeit = (GUICtrlRead($Sekunden)*1000 + GUICtrlRead($Minuten)*60000)


    while $Zeit >= 0

    GUICtrlSetData($Her, Round($Zeit/1000 ,0) & "sek heruntergefahren")

    Switch GUIGetMSG()
    Case $GUI_EVENT_Close
    ExitLoop
    Case $Abbrechen
    ExitLoop
    EndSwitch

    Sleep(90)
    $Zeit = $Zeit - 100
    WEnd

    Switch $Zeit

    Case -100
    GUIDelete ($Form1)
    Shutdown (1)

    Case 0.1 to 99999999999
    GUIDelete ($Form1)
    MsgBox(1,"Info","Vorgang durch Benutzer unterbrochen")
    WinSetState($Main,"",@SW_RESTORE)

    EndSwitch

    Else ;
    EndIf
    ;
    Case $StandBy
    If GUICtrlRead($Sofort) = 1 Then
    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    Shutdown (64)

    ElseIf GUICtrlRead($Spaeter) = 1 Then

    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    $Form1 = GUICreate("Form1", 230, 80, 1360, 750)
    $Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    $Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetState()
    $Zeit = (GUICtrlRead($Sekunden)*1000 + GUICtrlRead($Minuten)*60000)


    while $Zeit >= 0

    GUICtrlSetData($Her, Round($Zeit/1000 ,0) & "sek heruntergefahren")

    Switch GUIGetMSG()
    Case $GUI_EVENT_Close
    ExitLoop
    Case $Abbrechen
    ExitLoop
    EndSwitch

    Sleep(90)
    $Zeit = $Zeit - 100
    WEnd

    Switch $Zeit

    Case -100
    GUIDelete ($Form1)
    Shutdown (64)

    Case 0.1 to 99999999999
    GUIDelete ($Form1)
    MsgBox(1,"Info","Vorgang durch Benutzer unterbrochen")
    WinSetState($Main,"",@SW_RESTORE)

    EndSwitch

    Else ;
    EndIf

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

    Case $LogOff
    If GUICtrlRead($Sofort) = 1 Then
    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    Shutdown (0)

    ElseIf GUICtrlRead($Spaeter) = 1 Then

    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    $Form1 = GUICreate("Form1", 230, 80, 1360, 750)
    $Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    $Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetState()
    $Zeit = (GUICtrlRead($Sekunden)*1000 + GUICtrlRead($Minuten)*60000)


    while $Zeit >= 0

    GUICtrlSetData($Her, Round($Zeit/1000 ,0) & "sek heruntergefahren")

    Switch GUIGetMSG()
    Case $GUI_EVENT_Close
    ExitLoop
    Case $Abbrechen
    ExitLoop
    EndSwitch

    Sleep(90)
    $Zeit = $Zeit - 100
    WEnd

    Switch $Zeit

    Case -100
    GUIDelete ($Form1)
    Shutdown (0)

    Case 0.1 to 99999999999
    GUIDelete ($Form1)
    MsgBox(1,"Info","Vorgang durch Benutzer unterbrochen")
    WinSetState($Main,"",@SW_RESTORE)

    EndSwitch

    Else ;
    EndIf


    Case Else

    EndSwitch
    WEnd

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

    GUIDelete()
    EndFunc ;==>_Main

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hallo und herzlich Willkommen.

    Schau dir am besten einmal

    [autoit]

    TimerInit

    [/autoit]

    und

    [autoit]

    TimerDiff

    [/autoit]

    an. Dann müsste der Countdown immer gleich schnell laufen.

    MfG, James C.

  • Danke für die Anwort
    habe nun das Skript ein bisschen verändert doch läuft es noch ein bisschen mit den echten Sekunden auseinander
    (Vergleich mit Internetuhr)
    Weil ich die Zeit für den Vergleich der While Schleife nicht mit einbeziehen kann
    hat da noch jemand eine Idee ?

    [autoit]

    ElseIf GUICtrlRead($Spaeter) = 1 Then

    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    $Form1 = GUICreate("Form1", 230, 80, 1360, 750)
    $Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    $Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetState()
    $Zeit = (GUICtrlRead($Sekunden)*1000 + GUICtrlRead($Minuten)*60000)


    while $Zeit >= 0
    $begin = TimerInit()

    GUICtrlSetData($Her, Round($Zeit/1000 ,0) & "sek heruntergefahren")

    Switch GUIGetMSG()
    Case $GUI_EVENT_Close
    ExitLoop
    Case $Abbrechen
    ExitLoop
    EndSwitch


    Sleep(100)
    $dif = TimerDiff($begin)
    $Zeit = $Zeit - $dif
    WEnd

    [/autoit]
  • mal ein Ansatz zum dran rumspielen ;)

    [autoit]

    ElseIf GUICtrlRead($Spaeter) = 1 Then

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

    WinSetState($Main,"",@SW_SHOWMINNOACTIVE)
    $Form1 = GUICreate("Form1", 230, 80, 1360, 750)
    $Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    $Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    GUISetState(@SW_SHOW)
    GUISetState()
    $Zeit = (GUICtrlRead($Sekunden) + GUICtrlRead($Minuten)*60)

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

    Global $sek = @SEC
    While $Zeit > 0
    If $Zeit >= 0 Then
    While Sleep(10)
    If $sek <> @SEC Then ExitLoop
    Switch GUIGetMSG()
    Case $GUI_EVENT_Close
    ExitLoop
    Case $Abbrechen
    ExitLoop
    EndSwitch
    WEnd
    GUICtrlSetData($Her, "in " $Zeit & "sek heruntergefahren")
    $sek = @SEC
    $Zeit -= 1
    ConsoleWrite($Zeit & @CRLF)
    EndIf
    WEnd

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Habe mri die Funktion @sec angeschaut dennoch kapier ich nicht wie du es meinst ^^
    könnstest du es mir bitte genau erkären was diese Funktion hier genou macht ?

  • @SEC ist ein sogenanntes Makro.
    Funktioniert in AutoIt eigentlich wie eine Variable,
    nur das der Inhalt vom System reingeschrieben wird und nicht von Deinem Script.
    D.h. Dein PC aktualisiert das Makro @SEC und schreibt immer die aktuelle Systemzeit da rein (in dem Fall die Sekunde)
    Durch abspeichern der aktuellen Zeit (Sekunde) und dem darauf folgenden Vergleich
    der von uns gespeicherten Variable ($sek) und der realen Zeit (@SEC) kannst Du festlegen,
    dass nur bei einem Unterschied der beiden Werte eine Aktion ausgelöst werden soll.
    Da diese Scripte im Millisekunden Bereich abgearbeitet werden beginnt mit einer vernachlässigbaren Verzögerung (zumindest in deinem Fall)
    die erwünschte Aktion zu jeder "neuen" Sekunde.
    Um diese Prüfung jede Sekunde zu wiederholen wird bei Unterschied und erfolgter Aktion einfach unsere Variable ($sek) mit dem aktuellen Wert aktualisiert(@SEC)
    Damit stellst Du sicher, dass
    1. Deine Aktion jede Sekunde nur einmal ausgeführt wird (verhindert auch das flackern bei der Aktualisierung eines Labels)
    2. Deine Aktion mehr oder weniger genau (im Millisekunden Bereich) immer nach einer Sekunde ausgeführt wird.

    puhh, so viel aktualisiert ... :rofl:
    Ich hoffe, dass war jetzt verständlich ;)

    so long
    Schnuffel

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • oke danke für die gute Erklärung :)
    Da du das "Flakern" von meiner Anzeige angesprochen hast, habe ich dies bezüglich noch eine Frage/ benötige noch einen kleinen Tipp

    Habe oben bei der Erstellung des GUI noch die zwei Zeilen:
    GUICtrlSetState($Sekunden, $GUI_DISABLE)
    GUICtrlSetState($Minuten, $GUI_DISABLE)
    eingefügt.
    Und in dem Haupprogramm dann noch diese Zeile:
    If GUICtrlRead($Spaeter) = 1 Then GUICtrlSetState($Sekunden, $GUI_ENABLE)
    Damit die Fenster erst akitivert werden wenn ich das Label später ausgewählt habe
    Das Problem ist jetzt aber dass es flakert

    [autoit]

    $Label1 = GUICtrlCreateLabel("Minuten", 72, 202, 42, 17)
    $Label2 = GUICtrlCreateLabel("Sekunden", 195, 202, 53, 17)
    $Label3 = GUICtrlCreateLabel("Shutdown Programm by Nimmervoll Thomas", 8, 8, 214, 17)
    $Sofort = GUICtrlCreateRadio("Sofort", 16, 168, 113, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Spaeter = GUICtrlCreateRadio("Später", 130, 168, 113, 17)
    GUISetState(@SW_SHOW)
    GUISetState()
    GUICtrlSetState($Sekunden, $GUI_DISABLE)
    GUICtrlSetState($Minuten, $GUI_DISABLE)

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

    ; Run the GUI until the dialog is closed
    While 1

    If GUICtrlRead($Spaeter) = 1 Then GUICtrlSetState($Sekunden, $GUI_ENABLE)


    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

    Case $Restart

    If GUICtrlRead($Sofort) =

    [/autoit]
  • büdde schön:

    [autoit]

    $Label1 = GUICtrlCreateLabel("Minuten", 72, 202, 42, 17)
    $Label2 = GUICtrlCreateLabel("Sekunden", 195, 202, 53, 17)
    $Label3 = GUICtrlCreateLabel("Shutdown Programm by Nimmervoll Thomas", 8, 8, 214, 17)
    $Sofort = GUICtrlCreateRadio("Sofort", 16, 168, 113, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Spaeter = GUICtrlCreateRadio("Später", 130, 168, 113, 17)
    GUISetState(@SW_SHOW)
    GUISetState()
    GUICtrlSetState($Sekunden, $GUI_DISABLE)
    GUICtrlSetState($Minuten, $GUI_DISABLE)

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

    ; Run the GUI until the dialog is closed
    While 1


    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Spaeter
    GUICtrlSetState($Sekunden, $GUI_ENABLE)
    GUICtrlSetState($Minuten, $GUI_ENABLE)

    Case $Sofort
    GUICtrlSetState($Sekunden, $GUI_DISABLE)
    GUICtrlSetState($Minuten, $GUI_DISABLE)

    Case $Restart

    If GUICtrlRead($Sofort) =

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • wenn das Thema für Dich damit gelöst ist,
    dann bitte den Thread in deinem ersten Post auf "gelöst" setzen.

    Ebenfalls Danke ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hätte noch eine letzte Frage
    weißt du wie man einen Button mit eigenem Bild (jpg, bmp,...) erzeugt
    Hab dies trotz Hilfe und Interet nicht hinbekommen

  • dazu bitte einen neuen Thread eröffnen (anderes Thema)
    oder erstmal die Hilfe durchsuchen ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)