Timer scheint im Background nicht zu laufen

  • Hallo zusammen,

    da ich zu diesem Thema weder über Google noch hier im Forum etwas gefunden habe hier meine Frage:

    Ich habe eine kleine Applikation die sich nur in den Tray laden soll. In dieser Applikation soll ein Timer alle x Sekunden eine Funktion aufrufen. Allerdings scheint der Timer nichts zu machen, erst wenn ich mit der Maus über das Tray Icon fahren nach x Sekunden wird der Aufruf gestartet. Dies ist alelrdings sehr hinderlich für mich. Die Applikation soll im späteren Verlauf überprüfen ob am jeweiligen Rechner alle gegebenheiten gegeben sind damit ein anderes Programm reibungslos Funktioniert. Wenn nicht soll es sein Tray Icon ändern, evtl. noch eine Nachricht ausgeben.

    Problem ist aber das der Timer nur getriggert wird wenn a) die Zeit abgelaufen ist und b) man mit der Maus über das Tray Icon fährt. Letzteres ist das Problem. Gibt es keine Möglichkeit den Timer auch im Hintergrund sicher laufen zu lassen? Sleep ist leider keine Option da dadurch das ganze Programm angehalten wird und das Tray Menu nicht mehr funktioniert.

    Vielen Dank für eure Hilfe.

    Anbei der Quellcode:

    [autoit]

    Global $tStart = TimerInit();
    Global $icoState = 0;
    Global $LNSTATE[1][2];
    TraySetState()
    TraySetIcon("ok.ico");

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

    Func _setState($code, $state, $message)
    $LNSTATE[$code][0] = $state;
    $LNSTATE[$code][1] = $message;
    EndFunc

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

    Func _findBackupSet()
    If FileExists("F:\Notes_Backup\BACKUP") Then
    Local $gDir = FileFindFirstFile("F:\Notes_Backup\BACKUP\*!*");
    If $gDir = -1 Then
    _setState(0,1,"Kein Backup Set vorhanden");
    Else
    $BSUSER = "";
    While 1
    Local $file = FileFindNextFile($gDir)
    If @error Then ExitLoop
    $tmp = StringSplit($file,"!",2);
    $tmp2 = StringSplit($tmp[0],"_",2);
    For $i = 0 to UBound($tmp2)-1
    $BSUSER = $BSUSER & " " & $tmp2[$i];
    Next
    $LNDUSER = EnvGet("LNDUSER");
    If $BSUSER = $LNDUSER Then
    _setState(0,0,"Backup Set entspricht dem angemeldeten Benutzer");
    Else
    _setState(0,2,"Backup Set entspricht nicht dem angemeldeten Benutzer");
    EndIf
    WEnd
    EndIf
    Else
    _setState(0,1,"Kein Backup Set vorhanden");
    EndIf
    EndFunc

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

    Opt("TrayMenuMode", 3);

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

    Local $itmIP = TrayCreateItem("IP Adresse: " & @IPAddress1,-1,-1,0)
    TrayCreateItem("")
    Local $itmBUS = TrayCreateItem("Check Backup Set",-1,-1,0)
    TrayCreateItem("")
    Local $exititem = TrayCreateItem("Exit")

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

    While 1
    Local $msg = TrayGetMsg();
    $tmp = 0;
    For $x = 0 to UBound($LNSTATE, 1) - 1
    If $LNSTATE[$x][0] = 1 Then
    If $tmp < 1 Then
    $tmp = 1;
    EndIf
    EndIf
    If $LNSTATE[$x][0] = 2 Then
    If $tmp < 2 Then
    $tmp = 2;
    EndIf
    EndIf
    Next
    $icoState = $tmp;
    Select
    Case $icoState = 0;
    TraySetIcon("ok.ico");
    Case $icoState = 1;
    TraySetIcon("warning.ico");
    Case $icoState = 2;
    TraySetIcon("stop.ico");
    EndSelect
    Select
    Case $msg = 0
    ContinueLoop;
    Case $msg = $itmBUS
    $BS = _findBackupSet();
    Case $msg = $exititem
    ExitLoop
    EndSelect
    If TimerDiff($tStart) > 10000 Then
    ;_findBackupSet();
    MsgBox(4096, "Test", "1");
    $tStart = TimerInit();
    EndIf
    WEnd

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

    Exit

    [/autoit]

    Einmal editiert, zuletzt von BUM (27. Juni 2013 um 17:58)

  • Herzlich Willkommen im Forum BUM ;)
    Ich hab zwar nur den Text gelesen aber ich denke du suchst

    [autoit]

    AdlibRegister()

    [/autoit]

    PS: für längere Scripte bitte Spoiler nutzen

  • Hallo Schnitzel,

    danke für deinen Beitrag, nur ist mir beim durchlesen der Funktion aufgefallen das diese wohl auch das Script pausiert

    Zitat

    Die adlib Funktion sollte einfach gehalten werden, da sie oft ausgeführt wird und während dieser Zeit das Skript pausiert.

    Ist Sie also ähnlich der Sleep Funktion?

    Danke & Gruss

  • Deine Funktion wird z.B. alle 250 ms aufgerufen und während die aufgerufene Funktion läuft wird dein Script "pausiert"
    In den 250 ms kannst du aber machen was du willst ;)

  • Ahh, alles klar. Ja das reicht mir durchaus.

    Vielen Dank für die schnelle Hilfe.

    Gruss

  • Hi,

    Zitat

    Gibt es keine Möglichkeit den Timer auch im Hintergrund sicher laufen zu lassen?

    Du solltest die Möglichkeiten nutzen um zu prüfen, ob der Timer (du meintest das Script) wirklich nicht läuft.
    Wenn du die Debug-Möglichkeiten (s. Scite "Debug to Console" (Alt-D) und/oder "Debug to MsgBox" (Strg-Shift-D) nicht nutzt, bleibt noch eine Msgbox mit dem 4. Parameter. Dort eine 1 zeigt die Msgbox nur eine Sekunde, danach läuft das Script weiter.
    Alternativ kannst du bspw. Tooltip(Timerdiff(tStart)) in den Loop integrieren.
    Alle Möglichkeiten stehen offen um zu prüfen, ob das Script läuft oder nicht....aber die Aussage

    Zitat

    Allerdings scheint der Timer nichts zu machen,

    ist so nichts weiter als die Aufforderung: "Leg mir mal bitte einer den Arm aus der Sonne!" :rolleyes: