AdliREgister wird nur 1x ausgeführt

  • hi

    ich baue mir gerade ein tool welches übers inernet die aktuelel uhrzeit holt und anzeigt und ab einer bestimmten sekunde bsp. 37 und 50 einen zähler hochzählt.


    jedoch zählt der zähler nur 1x hoch und danach nicht mehr. ich weiß nicht genau warum


    !!!gelöst! es fehlte bei der Abfrage ein $i +1 anstaatt nur +1
    anbei mal der code


    [autoit]

    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.6.0
    Author: myName
    Script Function:
    Template AutoIt script.
    #ce ----------------------------------------------------------------------------
    ; Script Start - Add your code below here
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #include <IE.au3>
    Global $ntpServer = '0.de.pool.ntp.org' ; NTP-Server zum synchronisieren der Uhrzeit über das Internet
    Dim $i = 0
    Dim $wartezeit = 2
    #Region ### START Koda GUI section ### Form=c:\users\steven\desktop\autoit projekt\hauptseite.kxf
    $Form1_1 = GUICreate("Zeitkommentar", 268, 383, 192, 124)
    $quit_btn = GUICtrlCreateButton("Quit", 144, 96, 75, 25, $WS_GROUP)
    $Save_btn = GUICtrlCreateButton("Speichern", 48, 96, 75, 25, $WS_GROUP)
    $Label1 = GUICtrlCreateLabel("Countdown:", 48, 40, 178, 17)
    $Label2 = GUICtrlCreateLabel("Aktuelle Zeit:", 48, 16, 178, 17)
    $Edit1 = GUICtrlCreateEdit("tee", 40, 152, 193, 193)
    $Label3 = GUICtrlCreateLabel("Wartezeit:", 48, 64, 52, 17)
    $wartezeit_inp = GUICtrlCreateInput(" ", 120, 64, 73, 21)
    GUICtrlSetData(-1, "3")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    AdlibRegister("_timer", 1000)
    AdlibRegister("_TimeSync", 600)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister("_TimeSync")
    AdlibUnRegister("_timer")
    Exit
    Case $quit_btn
    AdlibUnRegister("_TimeSync")
    AdlibUnRegister("_timer")
    Exit
    Case $Save_btn
    Save()
    MsgBox(0, "Test", "Die Wartezeit wurde auf " & $wartezeit & " Gesetzt")
    EndSwitch
    WEnd
    Func Save()
    $wartezeit = GUICtrlRead($wartezeit_inp)
    EndFunc ;==>Save
    ;hier Beginnt der Durchlauf Counter
    Func _timer()
    $sek = StringRight(_TimeSync(), 2)
    If $sek = 30 or $sek = 50 Then
    $i = +1
    If $i = $wartezeit Then
    _IECreate("www.google.com", 1, 1, 0);hier muss die Funktion rein die dann nach ablauf ausgeführt werden soll
    $i = 0
    EndIf
    EndIf
    GUICtrlSetData($Label1, "Countdown: " & $i)
    EndFunc ;==>_timer
    Func _TimeSync()
    UDPStartup()
    Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123)
    ;$status = UDPSend($socket, MakePacket('1b0e010000000000000000004c4f434ccb1eea7b866665cb00000000000000000000000000000000cb1eea7b866665cb'))
    Local $status = UDPSend($socket, MakePacket('1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'))
    Local $data = '', $a = TimerInit() ; Timer setzen, damit im Fehlerfall die Schleife abgebrochen wird
    While $data = ''
    $data = UDPRecv($socket, 100)
    Sleep(100)
    If TimerDiff($a) > 1000 Then ExitLoop ; Wenn Timer > 1sek. (Fehler), dann Schleife verlassen
    WEnd
    If $data <> '' Then
    UDPCloseSocket($socket)
    UDPShutdown()
    Local $unsignedHexValue = StringMid($data, 83, 8); Extract time from packet. Disregards the fractional second.
    Local $value = UnsignedHexToDec($unsignedHexValue)
    Local $TZinfo = _Date_Time_GetTimeZoneInformation()
    Local $TZoffset = -(UnsignedToLong($TZinfo[1]) + (UnsignedToLong($TZinfo[4]) * ($TZinfo[0] < 2)) + (UnsignedToLong($TZinfo[7]) * ($TZinfo[0] = 2)))
    Local $UTC = _DateAdd('s', $value, '1900/01/01 00:00:00')
    Sleep(100)
    ;Return _DateAdd('n',$TZoffset,$UTC)
    $uhr = StringSplit(_DateAdd('n', $TZoffset, $UTC), " ")
    GUICtrlSetData($Label2, "Aktuelle Zeit: " & $uhr[2])
    Return $uhr[2]
    EndIf
    EndFunc ;==>_TimeSync
    Func MakePacket($d)
    Local $p = ''
    While $d
    $p &= Chr(Dec(StringLeft($d, 2)))
    $d = StringTrimLeft($d, 2)
    WEnd
    Return $p
    EndFunc ;==>MakePacket
    Func UnsignedHexToDec($n)
    Local $ones = StringRight($n, 1)
    $n = StringTrimRight($n, 1)
    Return Dec($n) * 16 + Dec($ones)
    EndFunc ;==>UnsignedHexToDec
    Func UnsignedToLong($value)
    Local Const $OFFSET_4 = 4294967296
    Local Const $MAXINT_4 = 2147483647
    If $value < 0 Or $value >= $OFFSET_4 Then Return SetError(1, 0, $value) ;' Overflow
    If $value <= $MAXINT_4 Then
    Return $value
    Else
    Return $value - $OFFSET_4
    EndIf
    EndFunc ;==>UnsignedToLong

    [/autoit]

    Einmal editiert, zuletzt von cobain86 (20. März 2010 um 18:01)

  • Hallo cobain86,

    die beiden funcs werden ausgeführt, habe es mit folgendem abgeändertem Skript getestet:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.6.0
    Author: myName
    Script Function:
    Template AutoIt script.
    #ce ----------------------------------------------------------------------------
    ; Script Start - Add your code below here
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #include <IE.au3>
    Global $ntpServer = '0.de.pool.ntp.org' ; NTP-Server zum synchronisieren der Uhrzeit über das Internet
    Dim $i = 0
    Dim $wartezeit = 2
    #region ### START Koda GUI section ### Form=c:\users\steven\desktop\autoit projekt\hauptseite.kxf
    $Form1_1 = GUICreate("Zeitkommentar", 268, 383, 192, 124)
    $quit_btn = GUICtrlCreateButton("Quit", 144, 96, 75, 25, $WS_GROUP)
    $Save_btn = GUICtrlCreateButton("Speichern", 48, 96, 75, 25, $WS_GROUP)
    $Label1 = GUICtrlCreateLabel("Countdown:", 48, 40, 178, 17)
    $Label2 = GUICtrlCreateLabel("Aktuelle Zeit:", 48, 16, 178, 17)
    $Edit1 = GUICtrlCreateEdit("tee", 40, 152, 193, 193)
    $Label3 = GUICtrlCreateLabel("Wartezeit:", 48, 64, 52, 17)
    $wartezeit_inp = GUICtrlCreateInput(" ", 120, 64, 73, 21)
    GUICtrlSetData(-1, "3")
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###
    AdlibRegister("_timer", 1000)
    AdlibRegister("_TimeSync", 600)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister("_TimeSync")
    AdlibUnRegister("_timer")
    Exit
    Case $quit_btn
    AdlibUnRegister("_TimeSync")
    AdlibUnRegister("_timer")
    Exit
    Case $Save_btn
    Save()
    MsgBox(0, "Test", "Die Wartezeit wurde auf " & $wartezeit & " Gesetzt")
    EndSwitch
    WEnd
    Func Save()
    $wartezeit = GUICtrlRead($wartezeit_inp)
    EndFunc ;==>Save
    ;hier Beginnt der Durchlauf Counter
    Func _timer()
    ConsoleWrite("TIMER" & @CRLF)
    $sek = StringRight(_TimeSync(), 2)
    If $sek = 30 Or $sek = 50 Then
    ConsoleWrite("Sek " & $sek & " " & $i)
    $i = +1
    If $i = $wartezeit Then
    _IECreate("www.google.com", 1, 1, 0);hier muss die Funktion rein die dann nach ablauf ausgeführt werden soll
    $i = 0
    EndIf
    EndIf
    GUICtrlSetData($Label1, "Countdown: " & $i)
    EndFunc ;==>_timer
    Func _TimeSync()
    ConsoleWrite("TIMESYNC" & @CRLF)
    UDPStartup()
    Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123)
    ;$status = UDPSend($socket, MakePacket('1b0e010000000000000000004c4f434ccb1eea7b866665cb00000000000000000000000000000000cb1eea7b866665cb'))
    Local $status = UDPSend($socket, MakePacket('1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'))
    Local $data = '', $a = TimerInit() ; Timer setzen, damit im Fehlerfall die Schleife abgebrochen wird
    While $data = ''
    $data = UDPRecv($socket, 100)
    Sleep(100)
    If TimerDiff($a) > 1000 Then ExitLoop ; Wenn Timer > 1sek. (Fehler), dann Schleife verlassen
    WEnd
    If $data <> '' Then
    UDPCloseSocket($socket)
    UDPShutdown()
    Local $unsignedHexValue = StringMid($data, 83, 8); Extract time from packet. Disregards the fractional second.
    Local $value = UnsignedHexToDec($unsignedHexValue)
    Local $TZinfo = _Date_Time_GetTimeZoneInformation()
    Local $TZoffset = -(UnsignedToLong($TZinfo[1]) + (UnsignedToLong($TZinfo[4]) * ($TZinfo[0] < 2)) + (UnsignedToLong($TZinfo[7]) * ($TZinfo[0] = 2)))
    Local $UTC = _DateAdd('s', $value, '1900/01/01 00:00:00')
    Sleep(100)
    ;Return _DateAdd('n',$TZoffset,$UTC)
    $uhr = StringSplit(_DateAdd('n', $TZoffset, $UTC), " ")
    GUICtrlSetData($Label2, "Aktuelle Zeit: " & $uhr[2])
    Return $uhr[2]
    EndIf
    EndFunc ;==>_TimeSync
    Func MakePacket($d)
    Local $p = ''
    While $d
    $p &= Chr(Dec(StringLeft($d, 2)))
    $d = StringTrimLeft($d, 2)
    WEnd
    Return $p
    EndFunc ;==>MakePacket
    Func UnsignedHexToDec($n)
    Local $ones = StringRight($n, 1)
    $n = StringTrimRight($n, 1)
    Return Dec($n) * 16 + Dec($ones)
    EndFunc ;==>UnsignedHexToDec
    Func UnsignedToLong($value)
    Local Const $OFFSET_4 = 4294967296
    Local Const $MAXINT_4 = 2147483647
    If $value < 0 Or $value >= $OFFSET_4 Then Return SetError(1, 0, $value) ;' Overflow
    If $value <= $MAXINT_4 Then
    Return $value
    Else
    Return $value - $OFFSET_4
    EndIf
    EndFunc ;==>UnsignedToLong

    [/autoit]


    Ergebnis:

    Spoiler anzeigen

    Deine Zähler werden ja nur bei exakt 30 oder 50 erhöht, daher werden sie selten erhöht. Eine kleine INet-Störung und schon wird der Punkt verpasst.

    Edit: Fehler in Zeile 57:

    [autoit]

    $i += 1 ;<============== $i = +1 war falsch

    [/autoit]

    mfg (Auto)Bert