Hilfe zum CountdownTimer

  • Mojen Leute,
    Komme einfach nicht weiter. Es geht um einen CountdownTimer. Habe zwar recht viele Anregungen hier im Forum gefunden, aber nichts, das mir weiter geholfen hat.
    Und so sieht das Problem aus:
    Die Events werden ueber eine ActiveXDLL uebermittelt. Fuer Anregungen waere ich sehr dankbar, falls ueberhaupt machbar.


    [autoit]


    ;$timerAdd soll dem dll_Event_Code zugeordnet werden um spaeter damit den CountDown zu fuettern
    Global $timerAdd1 = 240000
    Global $timerAdd2 = 85000
    Global $timerAdd3 = 1190000

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

    Start(); hier wurde start eingeleitet und ab jetzt sollen die events ausgewertet werden

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

    While 1 * Sleep(1) ; wird benoetigt wenn Event ausgeloest wird, damit das skript weiter laeuft
    WEnd

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

    Func _Event($Code) ; loest aehnliche Funktion aus wie die hier >>> $Code = int(Random(4,7))

    if $Code == 4 then
    $Code = $timerAdd1
    Starte mit oder addiere $timerAdd1 zum Countdown

    elseif $Code == 5 then
    $Code = $timerAdd2
    Starte mit oder addiere $timerAdd2 zum Countdown

    elseif $Code == 6 then
    $Code = $timerAdd3
    Starte mit oder addiere $timerAdd3 zum Countdown
    endif

    Folgendes soll passieren:
    Wenn Countdown = 0, dann erstelle "Gui Countdown nicht gestartet" und warte bis gestartet
    Wenn Countdown gestartet dann schliesse "Gui Countdown nicht gestartet" und erstelle neue
    Gui fuer die ablaufende Zeit, falls vor Ablauf der Zeit ein weiteres Ereigniss passiert,
    dann verlaengere die Zeit um die Variable.
    Wenn Countdown auf 0, dann schliessen und wieder "Gui Countdown nicht gestartet" erstellen
    und warten bis ein Event passiert

    EndFunc

    [/autoit]

    MfG OpaEd

    - MfG OpaEd

    2 Mal editiert, zuletzt von opaed (10. November 2009 um 23:13)

  • Ich versteh nicht ganz wo dein problem liegt so wie du deine frage aufgebaut hast willst du die nul abfragen dann tu es doch!!!!!

    Spoiler anzeigen
    [autoit]

    ;$timerAdd soll dem dll_Event_Code zugeordnet werden um spaeter damit den CountDown zu fuettern
    Global $timerAdd1 = 240000
    Global $timerAdd2 = 85000
    Global $timerAdd3 = 1190000

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

    Start(); hier wurde start eingeleitet und ab jetzt sollen die events ausgewertet werden

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

    While 1 * Sleep(1) ; wird benoetigt wenn Event ausgeloest wird, damit das skript weiter laeuft
    WEnd

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

    Func _Event($Code) ; loest aehnliche Funktion aus wie die hier >>> $Code = int(Random(4,7))

    MsgBox(0,'',$Code) ; <---------- Ihr kannst du schauen was du für werte bekommst und reagierst !!!!1

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

    If $Code = 0 Then
    ;was passieren soll
    ElseIf $Code = 1 Then
    ;was passieren soll
    ElseIf $Code = 2 Then
    ;was passieren soll
    ElseIf $Code = 3 Then
    ;was passieren soll
    ElseIf $Code = 4 Then
    $Code = $timerAdd1
    Starte mit oder addiere $timerAdd1 zum Countdown

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

    ElseIf $Code = 5 Then
    $Code = $timerAdd2
    Starte mit oder addiere $timerAdd2 zum Countdown

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

    ElseIf $Code = 6 Then
    $Code = $timerAdd3
    Starte mit oder addiere $timerAdd3 zum Countdown
    EndIf

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

    Folgendes soll passieren:
    Wenn Countdown = 0, dann erstelle "Gui Countdown nicht gestartet" und warte bis gestartet
    Wenn Countdown gestartet dann schliesse "Gui Countdown nicht gestartet" und erstelle neue
    Gui fuer die ablaufende Zeit, falls vor Ablauf der Zeit ein weiteres Ereigniss passiert,
    dann verlaengere die Zeit um die Variable.
    Wenn Countdown auf 0, dann schliessen und wieder "Gui Countdown nicht gestartet" erstellen
    und warten bis ein Event passiert

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

    EndFunc ;==>_Event

    [/autoit]

    Edit:

    [autoit]

    if $timerAdd1 = 0 Then
    If $timerAdd2 = 0 Then
    .........
    ....

    [/autoit]

    Wenn du was anders meinst stell deine frage ausführlicher!!!

    LG Kleiner

    Einmal editiert, zuletzt von kleiner27 (2. November 2009 um 08:56)

  • gggrr .. was n des für n code ?!

    sag doch gleich, dass du noch keinen ansatz hast , und jemand sucht, der die deinen code schreibt ..

    also ::

    zu : ;$timerAdd soll dem dll_Event_Code zugeordnet werden um spaeter damit den CountDown zu fuettern
    Global $timerAdd1 = 240000

    .. ich würde sagen das hört sich nach nem dllcall an .. guck dir mal die hilfe dazu an .. .. weil infos zu der dll kann dir da keiner helfen ..

    ---
    zu : ; Start(); hier wurde start eingeleitet und ab jetzt sollen die events ausgewertet werden

    ?? hä ? inizialisierungsroutine ?! schrieb sie doch hin , wenn du sie schon hast ..

    ---
    zu : ; While 1 * Sleep(1) ; wird benoetigt wenn Event ausgeloest wird, damit das skript weiter laeuft
    WEnd

    .. grrr ..

    Probiers mal mit

    while 1

    sleep(50)

    wend

    ...

    sleep(1) lahmt dein system .. unglaublich ..

    ----


    .. so und dann reden wir weiter ..

  • Hi,
    Ups, ich dachte eine gute Beschreibung des Problems geliefert zu haben.
    Mit dem Sleep werde ich das ändern.

    Zitat

    gggrr .. was n des für n code ?!

    sag doch gleich, dass du noch keinen ansatz hast , und jemand sucht, der die deinen code schreibt ..

    .. ich würde sagen das hört sich nach nem dllcall an .. guck dir mal die hilfe dazu an .. .. weil infos zu der dll kann dir da keiner helfen ..
    zu : ; Start(); hier wurde start eingeleitet und ab jetzt sollen die events ausgewertet werden

    ?? hä ? inizialisierungsroutine ?! schrieb sie doch hin , wenn du sie schon hast ..

    .. grrr ..
    while 1
    sleep(50)
    wend


    Es handelt sich um ActiveXDLL
    Ok, da die DLL nicht zu Verfügung steht, simuliere ich diese zum besseren Verständniss.

    Der button soll die Events $code simulieren. Das Inmputfeld soll den Counter simulieren.
    Wann und welcher Code ausgelöst wird, bestimmt die DLL, mit drücken des Buttons können wir ein Event generieren.

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 154, 206, 278, 133)
    $Input1 = GUICtrlCreateInput("", 16, 136, 121, 21, BitOR($ES_CENTER,$ES_READONLY))
    $Button1 = GUICtrlCreateButton("EventSimulation", 24, 24, 105, 57, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $timerAdd1 = 240000; Millisekunden nur als Beispiel
    Global $timerAdd2 = 85000; Millisekunden nur als Beispiel
    Global $timerAdd3 = 1190000; Millisekunden nur als Beispiel

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _TimeADD()
    EndSwitch
    WEnd

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

    Func _TimeADD()
    $Code = int(Random(4,7))

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

    if $Code == 4 then
    $Code = $timerAdd1
    elseif $Code == 5 then
    $Code = $timerAdd2
    elseif $Code == 6 then
    $Code = $timerAdd3
    endif
    ;hier komme ich nicht weiter.
    GUICtrlSetData ($Input1,$Code)
    EndFunc

    [/autoit]


    Ich drücke den Button, ein Event wird ausgelöst. Schliesse Fenster1 und erstelle Fenster2 (als Beispiel hier das Imputfeld) mit dem Countdown. Zähle runter. Falls die Zeit auf null kommt, schliesse Fenster2 und öffne wieder Fenster1. Ich drücke willkürlich den Button bevor die Zeit abgelaufen ist, in dem Fall sollen die Events auf die Zeit addiert werden.
    Problem 1.
    Keine Ahnung wie man hier die Events aufaddiert.
    Problem 2.
    Keine Ahnung wie ich den CountDown (runterzählend) hier erstellen soll.

    - MfG OpaEd

  • Ich habe das mal schnell dargestellt (Zwar nicht die beste lösung aber es ist eine) wenn es das ist was du meinst!

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 154, 206, 278, 133)
    $Input1 = GUICtrlCreateInput("", 16, 136, 121, 21, BitOR($ES_CENTER, $ES_READONLY))
    $Button1 = GUICtrlCreateButton("EventSimulation", 24, 24, 105, 57, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    $Form2 = GUICreate("Form1", 154, 206, 278, 133)
    $Input2 = GUICtrlCreateInput("", 16, 136, 121, 21, BitOR($ES_CENTER, $ES_READONLY))
    GUISetState(@SW_HIDE, $Form2)

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

    Global $timerAdd1 = 12540000; Millisekunden nur als Beispiel
    Global $timerAdd2 = 12585000; Millisekunden nur als Beispiel
    Global $timerAdd3 = 12590000; Millisekunden nur als Beispiel

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _TimeADD()
    EndSwitch
    WEnd
    ;############################ Ich habe die zeiten ein bischen verlängert das man auch das runterzählen sehen kann!
    Func _TimeADD()
    $Code = Int(Random(4, 7))
    If $Code == 4 Then
    $Code = $timerAdd1
    ElseIf $Code == 5 Then
    $Code = $timerAdd2
    ElseIf $Code == 6 Then
    $Code = $timerAdd3
    EndIf
    GUICtrlSetData($Input1, $Code)
    Sleep(50)
    While $Code
    GUISetState(@SW_HIDE, $Form1) ; versteckt gui (form1)
    GUISetState(@SW_SHOW, $Form2); zeigt gui (form2)
    GUICtrlSetData($Input2, $Code)
    $Code -= 1000 ; zählt 1000 runter
    If $Code = 0 Then ; wenn 0 dann fenster wechsel
    GUISetState(@SW_HIDE, $Form2)
    GUISetState(@SW_SHOW, $Form1)
    EndIf
    WEnd
    EndFunc ;==>_TimeADD

    [/autoit]

    LG Kleiner

  • Hi Kleiner,
    danke dir fuer deine Muehe. Es hat mir grosse Freude zubereitet, weil du dich so aktiv an meinem Problem mitbeteiligt hast.
    Leider habe ich wohl eine schlechte retorische Ausdrucksweise und so wurde mein Problem nicht ganz verstanden.
    Inzwischen koennte ich die Simulation fuer die Events vervollstaendigen um besser auf das eigentliche Problem aufzuzeigen.
    Im Spoiler ist das ergaenzte Skript.
    Wenn man das Skript startet, passiert genau das was ich moechte, ausser eine Moeglichkeit und zwar, wenn der Counter bereits laeuft und ein Event auftritt, dann wird die Zeit nicht hinzugerechnet.
    Also zum probieren, Skript starten Button druecken, CountDown beginnt, nochmal Button waehrend die Zeit runterrechnet und genau hier ist dann mein Trouble.
    Ich hoffe das war verstaendlich genug.

    Spoiler anzeigen
    [autoit]


    #include <date.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=

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

    ;Form1 ist nur fuer den Button und dient nur fuer den Test der Simulation
    ;ueber den Button generiere ich die Events, welche normaleweise von der DLL generiert,

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

    $Form1 = GUICreate("Form1", 180, 419, 192, 124)
    $Input1 = GUICtrlCreateInput("", 19, 259, 143, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL, $ES_READONLY, $ES_NUMBER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
    $Button1 = GUICtrlCreateButton("Button1", 47, 28, 80, 46, $WS_GROUP)
    GUISetState(@SW_SHOW)

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

    ; Fenster1 ist zu Beginn geoeffnet
    ; SplashText ist nur Beispiel
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    #EndRegion ### END Koda GUI section ###

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

    Global $GeheZumEnde, $lh, $lm, $ls
    Global $zeit1 = 10000
    Global $zeit2 = 40000
    Global $zeit3 = 20000000

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1

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

    _ZeitADD1()

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

    EndSwitch
    WEnd

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

    Func _ZeitADD1()
    $code = Int(Random(4, 7))

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

    ; Weil ein Event aufgetreten, wird Fenster1 geschlossen,
    ;jetzt wird Fenster2 erstellt, fuer die Simulation ist es $Input1
    ;in $Input1 laeuft die Zeit, wenn Zeit abgelaufen, wieder zum Fenster1 zurueck

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

    SplashOff()
    If $code == 4 Then
    $code = $zeit1
    ElseIf $code == 5 Then
    $code = $zeit2
    ElseIf $code == 6 Then
    $code = $zeit3
    EndIf

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

    $code = $code
    $GeheZumEnde = $code
    $start = TimerInit()

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

    While $GeheZumEnde > 0
    $GeheZumEnde = $code - TimerDiff($start)
    _RechneRunter()
    Sleep(1000)
    WEnd
    If TimerDiff($start) Then
    ;Timer ist bei 0 angekommen, oeffne wieder Fenster1 und warte auf Events
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")

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

    EndIf

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

    EndFunc ;==>_ZeitADD1

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

    Func _RechneRunter()
    Local $iHours, $iMins, $iSecs
    _TicksToTime($GeheZumEnde, $iHours, $iMins, $iSecs)
    If $lh <> $iHours Or $lm <> $iMins Or $ls <> $iSecs Then

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

    ;Die Imputbox (Fenster2 in unserem Beispiel) war ja schon erstellt, jetzt werden die Zeitdaten an diese uebertragen
    GUICtrlSetData($Input1, StringFormat("%02i", $iHours) & ":" & StringFormat("%02i", $iMins) & ":" & StringFormat("%02i", $iSecs))
    $lh = $iHours
    $lm = $iMins
    $ls = $iSecs
    EndIf
    EndFunc ;==>_RechneRunter

    [/autoit]


    -Mfg OpaEd

    - MfG OpaEd

  • Ersetze mal:

    [autoit]


    While $GeheZumEnde > 0
    $GeheZumEnde = $code - TimerDiff($start)
    _RechneRunter()
    Sleep(1000)
    WEnd

    [/autoit]

    Durch:

    [autoit]

    While $GeheZumEnde > 0
    $GeheZumEnde = $code - TimerDiff($start)
    _RechneRunter()
    $timer = TimerInit()
    do
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1
    _ZeitADD1()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Until TimerDiff($timer) > 1000
    WEnd

    [/autoit]

    Das setzt die Zeit zwar nur zurück, aber ich denke das sollte dir den groben denkanstoß geben.
    Sleeps gilt es meiner Meinung nach eh zu vermeiden, da sie das script pausieren udn das bis jetzt bei mir IMMER probleme verursacht hat.

  • Guten Morgen!

    Ich habe mir die sache mal genauer angeschaut: Ich habe dein problem soweit verstanden in der While zu addiren!
    Habe da mal was geschrieben!

    Spoiler anzeigen
    [autoit]

    #include <date.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=

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

    ;Form1 ist nur fuer den Button und dient nur fuer den Test der Simulation
    ;ueber den Button generiere ich die Events, welche normaleweise von der DLL generiert,

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

    $Form1 = GUICreate("Form1", 180, 419, 192, 124)
    $Input1 = GUICtrlCreateInput("", 19, 259, 143, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL, $ES_READONLY, $ES_NUMBER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
    $Button1 = GUICtrlCreateButton("Button1", 47, 28, 80, 46, $WS_GROUP)
    Local $zaehlen = GUICtrlCreateInput('0', -100, -100) ; Eine Input die nicht im sichtfeld ist!
    GUISetState(@SW_SHOW)

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

    ; Fenster1 ist zu Beginn geoeffnet
    ; SplashText ist nur Beispiel
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    #EndRegion ### END Koda GUI section ###

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

    Global $GeheZumEnde, $lh, $lm, $ls
    Global $zeit[3] = [10000, 40000, 20000000]

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _ZeitADD1()
    EndSwitch
    WEnd
    Func _ZeitADD1()
    $code = Int(Random(4, 7))
    ; Weil ein Event aufgetreten, wird Fenster1 geschlossen,
    ;jetzt wird Fenster2 erstellt, fuer die Simulation ist es $Input1
    ;in $Input1 laeuft die Zeit, wenn Zeit abgelaufen, wieder zum Fenster1 zurueck

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

    SplashOff()
    If $code == 4 Then
    $code = $zeit[0]
    ElseIf $code == 5 Then
    $code = $zeit[1]
    ElseIf $code == 6 Then
    $code = $zeit[2]
    EndIf

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

    $aus = GUICtrlRead($zaehlen); Die Input auslesen
    $code += $aus * 1000; Da soltest du schauen wie du die zeit wieder aufaddirst ich habe 1000 genommen
    $GeheZumEnde = $code
    MsgBox(0, '', $aus); Zum schauen was der ausgelesene wert dir gibt
    $start = TimerInit()

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

    While $GeheZumEnde > 0
    $GeheZumEnde = $code - TimerDiff($start)
    _RechneRunter()
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE ; zum schlißen der gui (form1) Habe ich hir her verlegt denn sonst hat sich die gui (form1) sich nicht schlißen lassen
    Exit
    Case $Button1 ; noch mal weil dann sich der Button wieder ausführen läst!
    Local $test = GUICtrlRead($Input1); Auslesen was gerade in der ( Input1 ) steht sagen wir mal 05:35:03
    Local $fei = StringReplace($test, ':', ''); Hir wird der String nach ( : ) durchsucht und entfernt
    GUICtrlSetData($zaehlen, $fei); die ausgabe wehr dann 053503 wie schon gesagt mußt mal schauen wie du den wert aufrechnest!
    _ZeitADD1()
    EndSwitch
    WEnd

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

    If TimerDiff($start) Then
    ;Timer ist bei 0 angekommen, oeffne wieder Fenster1 und warte auf Events
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    EndIf
    EndFunc ;==>_ZeitADD1

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

    Func _RechneRunter()
    Local $iHours, $iMins, $iSecs
    _TicksToTime($GeheZumEnde, $iHours, $iMins, $iSecs)
    If $lh <> $iHours Or $lm <> $iMins Or $ls <> $iSecs Then
    ;Die Imputbox (Fenster2 in unserem Beispiel) war ja schon erstellt, jetzt werden die Zeitdaten an diese uebertragen
    GUICtrlSetData($Input1, StringFormat("%02i", $iHours) & ":" & StringFormat("%02i", $iMins) & ":" & StringFormat("%02i", $iSecs))
    $lh = $iHours
    $lm = $iMins
    $ls = $iSecs
    EndIf
    EndFunc ;==>_RechneRunter

    [/autoit]

    Gute Nacht! ;)

    LG Kleiner

    Einmal editiert, zuletzt von kleiner27 (3. November 2009 um 03:43)

  • Mich hat das heute Morgen nicht losgelassen!

    Darum noch eine Version die ich besser finde!

    Bitte:

    Spoiler anzeigen
    [autoit]

    #include <date.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    ;Form1 ist nur fuer den Button und dient nur fuer den Test der Simulation
    ;ueber den Button generiere ich die Events, welche normaleweise von der DLL generiert,
    $Form1 = GUICreate("Form1", 180, 419, 192, 124)
    $Input1 = GUICtrlCreateInput("", 19, 259, 143, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL, $ES_READONLY, $ES_NUMBER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
    $Button1 = GUICtrlCreateButton("Button1", 47, 28, 80, 46, $WS_GROUP)
    Local $zaehlen = GUICtrlCreateInput('0', -100, -100) ; Eine Input die nicht im sichtfeld ist!
    GUISetState(@SW_SHOW)
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    #EndRegion ### END Koda GUI section ###
    Global $GeheZumEnde, $lh, $lm, $ls
    Global $zeit[3] = [10000, 40000, 20000000]
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _ZeitADD1()
    EndSwitch
    WEnd
    Func _ZeitADD1()
    $code = Int(Random(4, 7))
    SplashOff()
    If $code == 4 Then
    $code = $zeit[0]
    ElseIf $code == 5 Then
    $code = $zeit[1]
    ElseIf $code == 6 Then
    $code = $zeit[2]
    EndIf
    $GeheZumEnde = $code
    $start = TimerInit()
    Do
    $aus = GUICtrlRead($zaehlen) * 1000
    $GeheZumEnde = ($code + $aus) - TimerDiff($start)
    _RechneRunter()
    Local $test = GUICtrlRead($Input1)
    Local $fei = StringReplace($test, ':', '')
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1
    GUICtrlSetData($zaehlen, $fei)
    _ZeitADD1()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If $fei = 0 Then
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    ExitLoop
    EndIf
    Until 0
    EndFunc ;==>_ZeitADD1
    Func _RechneRunter()
    Local $iHours, $iMins, $iSecs
    _TicksToTime($GeheZumEnde, $iHours, $iMins, $iSecs)
    If $lh <> $iHours Or $lm <> $iMins Or $ls <> $iSecs Then
    GUICtrlSetData($Input1, StringFormat("%02i", $iHours) & ":" & StringFormat("%02i", $iMins) & ":" & StringFormat("%02i", $iSecs))
    $lh = $iHours
    $lm = $iMins
    $ls = $iSecs
    EndIf
    EndFunc ;==>_RechneRunter

    [/autoit]

    Jetzt solte es gehen!

    LG Kleiner

  • Bug habe ich noch behoben ein kleiner ist noch den überlasse ich dir! ;)

    Spoiler anzeigen
    [autoit]

    #include <date.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    $Form1 = GUICreate("Form1", 180, 419, 192, 124)
    $Input1 = GUICtrlCreateInput("", 19, 259, 143, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL, $ES_READONLY, $ES_NUMBER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
    $Button1 = GUICtrlCreateButton("Button1", 47, 28, 80, 46, $WS_GROUP)
    Local $zaehlen[1] = [GUICtrlCreateInput('0', -100, -100)] ; Eine Input die nicht im sichtfeld ist: zum auslesen des gespeicherten ( glesenen ) wert!
    GUISetState(@SW_SHOW)
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    Global $GeheZumEnde, $lh, $lm, $ls,$a = 0
    Global $zeit[3] = [10000, 40000, 20000000] ; Habe ich in eine Array gepackt spart platz ( zeilen )!
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE; Ich habe dein aufbau beibehalten denn ich weiß nicht wie du weiter machst, ich würde alles mit ( GUIOnEventMode ) machen!
    Exit
    Case $Button1
    _ZeitADD1()
    EndSwitch
    WEnd
    Func _ZeitADD1()
    MsgBox(0, '', GUICtrlRead($zaehlen[0])); zum Debugen: auslesen was du fürn wert bekommst, um daruf reagieren zu könne !
    $code = Int(Random(4, 7));------------------------------------------------------------------------------
    MsgBox(0,'',$code)
    SplashOff()
    If $code == 4 Then
    $code = $zeit[0]
    ElseIf $code == 5 Then; !##! Ist gleich geblieben !##! (ausser (zeile 33) )
    $code = $zeit[1]
    ElseIf $code == 6 Then
    $code = $zeit[2]
    EndIf
    ; $code = $code <---- brauchst du nicht denn du legst den wert schon zu ( $GeheZumEnde )
    $GeheZumEnde = $code
    $start = TimerInit();----------------------------------------------------------------------------------
    Do; ( schleife )!
    $aus = GUICtrlRead($zaehlen[0]);läuft mit in der schleife denn wenn du denn butten erneut clickst wird der gespeicherte wert ausgelesen und verarbeitet!
    $GeheZumEnde = ($code + $aus) - TimerDiff($start); hir lass ich den zurückgegebenen wert mit einrechenen!
    _RechneRunter()
    Local $test = GUICtrlRead($Input1);läuft mit und ist wichtig denn wenn du den button clickst, wurde die input bereits ausgelesen und kann gesetzt werden!
    Local $fei = StringReplace($test, ':', '');Ihr lass ich den zurückgegebenen wert von (:) befreien denn wenn z.B 00:00:90 zurückgegeben wurde ist dann nach
    ;denm (:) entfernen 00009 ist wichtig für das rechnen und wieder einspielen in die rechnung!
    $nMsg = GUIGetMsg(); mußte nochmal gesetzt werden denn in der schleife ist es nicht möglich befehle einzubrinen vieleicht schon aber die kenn ich nicht!
    Switch $nMsg
    Case $Button1
    GUICtrlSetData($zaehlen[0], $fei * 1000);durch clicken des button wird der wert in ( $zaehlen ) neu gesetzt die werte wurden ja schon gelesen und
    ; von (:) entfernt so könne wir auch gleich den wert wieder aufrechnen das wehr dann bei 00009 * 1000 = 9000 = 9 sec.
    _ZeitADD1(); soltest du drin lassen durch meine test ging und ging es mal "nicht", das heist in manchen fällen addiert er und in machen subtrahiert er
    Case $GUI_EVENT_CLOSE;um den code auch wieder schließen zu können
    Exit
    EndSwitch
    If $fei = 0 Then; überprüfung ob Input 0 erreicht hat dann das und das
    SplashTextOn("", "Das ist Fenster 1" & @CRLF & "Test hat noch nicht begonnen", "-1", "100", "-1", "-1", 3, "Courier New", "20", "400")
    GUICtrlSetData($zaehlen[0], '0');um den wert wieder auf 0 zu setzen wenn du nach ablauf der zeit denn button erneut clickst, ist wichtig sonst bekommst
    ; du ein falschen wert z.b bei meiner darstellung, 9000 der wird beim zweiten click miteingerechnet. Die zeit runtergezählt du denn button erneut
    ; clickst wirst du den noch immer enthaltenen wert der Input ( $zaehlen ) = 9000 bekommen darum setzen wir ihn auf 0
    ExitLoop; um die schleife zu verlassen!
    EndIf
    Until 0
    EndFunc ;==>_ZeitADD1
    ;Ganz wichtig geht die rechnug über stunden z.B die Input zeigt 05:33:00 wie er bei $code = 6 ausgibt an und du wieder den button clickst bei 05:20:00
    ;oder einer anderen ist die rechnung * 1000 nicht mehr angemessen du sagtest das du kurz vor ende die eigentschaft braucht ansonsten ist das rechnen mit * 1000
    ;zu hoch ich will dir ja nicht alles weg nehmen darum überlass ich dir den kleinen Bug :) der solte nicht all zu schwer sein! :)

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

    ;/////////////////////////////////////////////////////// Ich hoffe das meine Beispiel dir ein wenig helfen konnte! \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Func _RechneRunter()
    Local $iHours, $iMins, $iSecs
    _TicksToTime($GeheZumEnde, $iHours, $iMins, $iSecs)
    If $lh <> $iHours Or $lm <> $iMins Or $ls <> $iSecs Then
    GUICtrlSetData($Input1, StringFormat("%02i", $iHours) & ":" & StringFormat("%02i", $iMins) & ":" & StringFormat("%02i", $iSecs))
    $lh = $iHours
    $lm = $iMins
    $ls = $iSecs
    EndIf
    EndFunc ;==>_RechneRunter
    ;////////////////////////////////////////////////////////////////// Mit freundlichen Grüßen Kleiner \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    [/autoit]

    LG Kleiner

  • Zitat


    Danke für deine Mithilfe.
    Den Tip mit DO :: Until merke ich mir, habe die Zeile ausgetauscht aber etwas unangenehmes bemerkt. Habe den Taskmanager gestartet und mir die CPU Auslastung angeschaut. Während der Counter lief sprang die Auslastung auf 50%.
    Wenn ich das Skript ohne die DLL ausführe, liegt die Auslastung beim laufenden Counter bei 1%.
    Werde mir das Morgen noch genauer anschauen.
    MfG OpaEd

    Zitat


    @kleiner27


    :thumbup: Hammer Engagement von dir, solltest dich mal etwas bremsen, weil das Tempo kann ich nicht mithalten :D
    Deine erste Lösung hatte ich bereits heute Morgen gesehen, aber ein mieser Tag hat mich der Freude an deine Mithilfe beraubt.
    Sorry für das späte Feedback.
    Habe jetzt auch dein drittes Skript im Test, super auskommentiert. Der este Eindruck sieht nach erfolgreicher Operation aus.
    Werde mir das morgen in Ruhe anschauen und mich nochmals melden. Heute gehts in Richtung :sleeping:
    MfG OpaEd

    - MfG OpaEd