Timer Problem

  • Hallo zusammen,

    es ist mal wieder soweit. Vor vielen vielen Moden hab ich was mit Hilfe von euch gebastelt und jetzt geht was nicht und ich soll rausfinden was. Da ich aber mittleweile eigentlich garnicht mehr programmiere. Hab ich schon wieder alles vergessen und steh jetzt auf dem Schlauch.

    Das ist der Schnipsel:


    Ich hab in dieses _CheckDrives eine MsgBox eingebaut um zu sehen ob es aufgerufen wird. Wird es aber nicht alle 20 Sekunden.
    Ist das soweit alles richtig? Ich kann mich nicht mehr wirklich dran erinnern. :whistling:

  • Hy, bei zwei Funktionen benötigst du auch zwei Timer!
    Sobald eine Funktion das Zeilimit erreicht wird doch der Timer resetet und das Timing kann für die andere Funktion natürlich nicht mehr richtig sein.

    Grüsse!

  • Einfach statt $timer, $timer[2] schreiben. Den ersten fragst du dann mit $timer[0] ab. Ebenso bei der erneuten Timer zuweisung, darauf achten das du den richtigen Timer verwendest.
    Musst halt etwas Rumtesten, es ist nicht so kompliziert wie es auf den ersten Blick erscheint ;)
    Ausserdem hast du doch bereits Arrays in deinem Scriptausschnitt integriert, kannst dich doch an diesen orientieren.
    Da ich nur Mobil unterwegs bin, kann ich dir leider kein Codeschnipsel liefern...

    Grüsse!

  • Argh.... das ist echt Murks wenn man das nicht regelmäßig macht.
    Also so:


    ich probier mal etwas rum...vielleicht fällt es mir dabei wieder ein ?(;)

  • Jetzt hab ich endlich auch mal den originalthread wieder gefunden: Programm soll VPN Eregnis abwarten[/url]


    Also was meine Verständnis sprengt:


    Array mit 2 Teimern ist klar....immerhin:)


    Dann muss ich beide Abfragen...auch klar....
    Das würde hier passieren:


    Code
    If TimerDiff($timer) >= $Funktionen[$counter][1] Then ;
            $timer = TimerInit() ;
    
    
            Execute('Call(' & $Funktionen[$counter][0] & ')') ;



    Sähe dann so aus:

    Code
    If TimerDiff($timer[0]) >= $Funktionen[$counter][1] Then ; Wozu hier die [1] ist krieg ich auch nicht mehr in die Birne
            $timer[0] = TimerInit() ; Zeitmarke wird neu gesetzt
    
    
            Execute('Call(' & $Funktionen[$counter][0] & ')') ; [url='https://autoit.de/index.php/Thread/45369-Programm-soll-VPN-Eregnis-abwarten/?postID=360225&highlight=In%2Bdiesem%2BArray%2Bkann%2Bman%2Beinstellen%2Bwie%2Bviel%2BZeit%2Bzwischen%2Bdem%2BAufruf%2Bder%2BFunktionen%2Bliegen%2Bsoll#post360225']

    und das gleich dann nochmal für $timer[1]...richtig?

    Einmal editiert, zuletzt von Camulus (1. Dezember 2014 um 11:41)

    • Offizieller Beitrag

    Statt mehrerer Timer kann man auch einfach mit einem einzigen Timer arbeiten.
    Ich habe Dir mal ein Beispiel geschrieben (mit entsprechenden Kommentaren):

    Spoiler anzeigen
    [autoit]


    Global $iTimer = TimerInit(), $iTimerDiff = 0

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

    ; das folgende Array $aFunktions ist ein 2D-Array mit jeweils 3 Werten:
    ; 1. Wert = die aufzurufene Funktion,
    ; 2. Wert = Wann die Funktion aufgerufen werden soll (in Millisekunden)
    ; 3. Wert = Wird als Counter benutzt (wie oft die Funktion aufgerufen wurde)
    Global $aFunktions[3][3] = [['_VPNStatus', 5000, 1], ['_CheckDrives', 20000, 1], ['_SendToNSA', 60000, 1]]

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

    HotKeySet('{ESC}', '_Exit') ; <- um das Programm beenden zu können

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

    ConsoleWrite('!> Programm gestartet!' & @CR)

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

    While Sleep(250) ; Sleep-Befehl, um den Prozessor zu entlasten. Kann auch auf bis zu 10 ms reduziert werden (je nach Aufrufhäufigkeit der Funktionen)
    $iTimerDiff = TimerDiff($iTimer)
    For $i = 0 To UBound($aFunktions) - 1 ; hier werden alle Funktionen aus dem Array überprüft
    If $iTimerDiff / $aFunktions[$i][1] > $aFunktions[$i][2] Then ; ist die TimerDifferenz geteilt durch die Millisekunden größer als der Counter, dann...
    ConsoleWrite(StringFormat('+> Zeit: %i Sek., Aufruf Nr.: %i, Starte Funktion: "%s"\n', Int($iTimerDiff / 1000), $aFunktions[$i][2], $aFunktions[$i][0]))
    $aFunktions[$i][2] += 1 ; den Counter erhöhen
    Call($aFunktions[$i][0]) ; und die Funktion aufrufen
    EndIf
    Next
    WEnd

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

    Func _Exit()
    If MsgBox(4, 'Timer', 'Programm wirklich beenden?') = 7 Then Return
    ConsoleWrite('!> Programm beendet!' & @CR)
    Exit
    EndFunc ;==>_Exit

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

    Func _VPNStatus()
    ConsoleWrite('-> Funktion VPNStatus ausgeführt!' & @CR)
    EndFunc ;==>_VPNStatus

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

    Func _CheckDrives()
    ConsoleWrite('-> Funktion _CheckDrives ausgeführt!' & @CR)
    EndFunc ;==>_CheckDrives

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

    Func _SendToNSA()
    ConsoleWrite('-> Funktion _SendToNSA ausgeführt! ;-)' & @CR)
    EndFunc ;==>_SendToNSA

    [/autoit]
  • Ok, danke.
    Aber wozu muss der Counter hochzählen wie oft die Funktion aufgerufen wurde?

    Das ganze Teil soll eigentlich immer in Hintergrund laufen. Und halt eben die Verbindung und die Laufwerke regelmäßig checken.

  • Camulus:
    Alles was hier an die "Console" gesendet wird, also beginnend mit "ConsoleWrite", kannst Du doch austauschen nach dem was DU möchtest.
    Nur die 16. Zeile, die sagt, wann es dann zeitlich an der Zeit ist, es zu tun, was Du dann möchtest. Okay? ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl