Timer Pause-Funktion

  • Hallo zusammen,

    ich bin neu in der Welt des Programmierens und versuche mit AutoIT die Grundlagen zu verstehen.

    Aktuell arbeite ich an einer Stoppuhr die später von einem übergeordneten Programm verwendet werden soll. Ich scheitere allerdings an der Pause Funktion, da durch _TicksToTime einfach weiter gezählt wird.

    Hier mein Code:

    Über Hilfe und Anregungen würde ich mich sehr freuen.

  • Hi :)

    Erstmal zum Stil:

    Konsistenz bei Variablen/Funktionen Benennung: $hWH_Timer / $__chBTN_TimerStart / $g_iSecs / _Timer_WIN() / __TimerStart() / _Timer()

    Du solltest einen Stil wählen und dann dabei bleiben.

    In AutoIt wird bei Variablen und Funktionen normalerweise mit camelcase gearbeitet. Also am Anfang klein und dann jedes neue Wort mit nem Großbuchstaben.

    z.B. $gTimerMainGui, $iTimerTimeLabel oder timerStart(), timerStop()

    Bei Funktionen werden interne AutoIt-Funktionen am Anfang groß geschrieben z.B. GuiGetMsg(), GuiCtrlSetData(), ...

    UDFs die von mit AutoIt ausgeliefert werden (in der Hilfe zu finden sind) fangen auch mit einem _ an und haben dann den UDF Namen, gefolgt von der Funktion.

    z.B.: _GDIPlus_PenSetColor, _GDIPlus_RectFCreate, ...

    UDFs, die nicht mit AutoIt selbst kommen fangen mit __ an und sonst wie eine normale UDF.

    z.B. für meine Wallpaper UDF: __Wallpaper_InitDefaultTray(), __Wallpaper_Start, ...

    Deshalb schreibt man eigene Funktionen am Anfang klein oder (wie ich meistens) mit einem _ am Anfang, um nicht ausversehen Funktionen gleich zu nennen und Konflikte zu vermeiden.

    Also in deinem Fall: _timerStart(), _timerStop(),...

    Für Variablen gelten die gleichn Regeln, nur dass man noch am Anfang das kürzel für den Dateityp hat. Also z.B. $hTimer, $iTimerLabel,...

    Bei UDFs dann dementsprechend $__Wallpaper_bRunning, $__Wallpaper_bClear, ...

    Ansonsten schaut das schon ganz gut aus (ich vermute mal die Formatierung wurde beim posten durcheinander geworfen).

    In deiner Haupt-Scheife solltest du ein Sleep einbauen, um Resourcen zu sparen. Der Nutzer merkt es nicht, ob 10ms vergehen, bis auf den Buttonklick reagiert wird. Dafür ist die CPU nicht permanent damit ausgelastet die Schleife zu durchlaufen.

    Code
    While Sleep(10) And Not $bEnd
        Switch GUIGetMsg()
            Case $iTimerExitButton
                _timerExit()
            Case $iTimerStartButton
                _timerStart()
            Case $iTimerPauseButton
                _timerPause()
        EndSwitch
    WEnd

    Wenn ich mehrere Controls (hier die buttons) habe, die die gleiche größe haben und sehr Strukturiert angeordnet sind nehm ich gerne nen Array (s. Beispiel), da ich jetzt ohne Probleme die größe des Fensters erhöhen könnte und einen Button ins Array hinzufügen kann, ohne dann alle anderen Werte anpassen zu müssen. Ich hab allgemein die Controls so erstellt, dass du einfach $iTimerGuiWidth ändern kannst und alle Controls werden passend mit skaliert.

    Z.B. Local Static $iTimerCount = 0 ist nützlich, wenn man eine Variable nur in einer Funktion benutzt, die Funktion aber öfter verwendet wird. Sorgt für weniger globale Variablen.

    Ansonsten evtl. drauf achten, dass Deutsch/Englisch einheitlich bleibt. (z.B. $Ende, wo auch der Typ (boolean) fehlte).

    So etwa hätte ich das umgesetzt:

    Ich hab statt dem Adlibregister einfach einen Call in der Hauptschleife genutzt.

    Kann ggf. nicht so gut funktionieren, wenn in deinem größeren Programm dann mehrere Schleifen sind.

    Hoffe, das hilft dir etwas weiter :).

    MfG Kanashius.

  • Hallo,

    vielen Dank für deine Hilfe und Erklärung. Das hilft mir doch schon sehr . Mein grundlegendes Problem habe ich leider immer noch:

    Wenn ich zB nach 10 sec auf Pause klick, 10 sec warte und wieder auf Resume klick macht der Timer bei 20 sec weiter. Er sollte aber bei den 10 sec weiter machen.

  • Moin,

    ich habe den Code von Kanashius überarbeitet. Damit sollte die Pause funktionieren. Die Änderungen sind mit  ; <- 220824 markiert:

  • Hallo zusammen,

    ich habe den Timer etwas erweitert und versuche nun unterschiedliche Zeiten in einem Array zusammenzuzählen. Im endeffekt sollen alle Timerzeiten addiert werden sodass ich eine Gesamtzeit bekomme. Ich habe aktuell leider keinen Lösungsweg. Das ganze soll später einen eigenen Button sowie eine eigene GUI bekommen. Aber erstmal muss es funktionieren ^^. Über eure erneute Hilfe wäre ich euch sehr dankbar.

  • Vielleicht bin ich blind aber wo packst du die Zeiten denn ins Array oder hakt es da schon?

    Und wann soll das passieren? Ich gehe davon aus, jedesmal wenn der Timer gestoppt wird, das würde bedeuten, das das immer vor dem Zurücksetzen der Daten passieren muss.

    1. Ein leeres (dummy) array erstellen.

    2. wenn der Timer beendet wird den eintrag per arrayinsert (arrayadd geht besser, wenn das Ergebnis nicht auch im Array angezeigt werden soll oder oben anstatt unten steht) hinzufügen und (z.B. per Schleife) alle einzelnen Werte als Number() auslesen, zusammenrechnen und ausgeben.

  • Ich hatte vor vielen Jahren mal eine Stoppuhr erstellt mit Rundenmessung (Anzeige Runde, Zeitmessung läuft weiter). Vielleicht für dich brauchbar.

  • Vielleicht bin ich blind aber wo packst du die Zeiten denn ins Array oder hakt es da schon?

    Ab Zeile 111 wird ins Array geschrieben. ich hab jetzt noch rumprobiert, bekomme es aber nicht hin.

    Ich hatte vor vielen Jahren mal eine Stoppuhr erstellt mit Rundenmessung (Anzeige Runde, Zeitmessung läuft weiter). Vielleicht für dich brauchbar.

    Danke. Leider nein.

  • AutoIt
    $arTimerList[$iTimerCount][1] =  Number($arTimerList[$iTimerCount][1]) + $iTimerCount ;lass die führende Null erstmal weg, formatierungen etc. kommen wenn es läuft und diese musst du später dann auch noch beachten
  • Moin,

    ich verstehe bisher auch nicht genau, wo Du hinwillst. Was soll z.B. $iCountAmount bewirken. Man kann es nur manuell verändern, auch während die Messung läuft. Welche Aussage haben dann die Spalten Counter und Counter diff?

    Ich würde die Spaltenüberschriften als Headerstring definieren. Den kannst Du dann sowohl für _ArrayDisplay() als auch für ein ListView verwenden

    Die Gesamtzeit würde ich in der Zeile 0 verwalten. Dann musst Du das nicht ständig verschieben.

    Ein Vorschlag:

  • Und wenn du das Zahlenformat willst ginge das in etwa so (ich bin mir sicher das geht einfacher kürzer ist abe raus dem Ärmel geschüttelt):

  • ich verstehe bisher auch nicht genau, wo Du hinwillst. Was soll z.B. $iCountAmount bewirken. Man kann es nur manuell verändern, auch während die Messung läuft. Welche Aussage haben dann die Spalten Counter und Counter diff?

    Das ganze soll für ein Spiel sein. Ich will wissen, wie lange wir zu einem Boss brauchen, wie lange dann der Bosskampf geht und wie oft wir gestorben sind. Eine Runde hat mehrere Bosse. Den „Todescounter“ zähle ich manuell hoch.

    Vielen lieben Dank. Allerdings ist bei der Gesamtzeit Berechnung ein Fehler, bei mehreren Werten zählt er über 60 Sek hinaus, was das Ergebnis verfälscht. Wie kann ich das ändern? So ganz steig ich noch nicht durch ^^

  • Stimmt, da sind zwei Flüchtigkeitsfehler in _AddTimes():