[INCLUDE] MultiTimer

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link


  • Was ist MultiTimer?
    - MultiTimer ermöglicht es mehrere Timer innerhalb eines Timers laufen zu lassen, sodass der Server entlastet wird


    Welche Probleme könnten auftreten?
    - Zur Zeit kann MultiTimer nur Timer mit einem Sekundenintervall starten (z.b. 1 Sek, 2 Sek..)
    - Alle Intervalle sind in Sekunden angegeben (bitte keine Millisekunden verwenden!)
    - Es können keine Parameter mit eingebunden werden
    - Es müssen alle Timer mit einem Mal gestartet werden, können aber danach gleich wieder gestoppt und später neu gestartet werden


    Wie funktioniert MultiTimer?
    Es läuft ein großer Timer mit dem Interval 1000 ms.
    Sobald man einen Timer mit MultiTimer startet wird ihm der Intervall zugewiesen, der sekündlich vom "großen" Timer erhöht wird.
    Erreicht der Timer seinen Intervall, so wird ein Callback aufgerufen.


    Wie viele Timer unterstützt MultiTimer?
    - Unendlich, zu definieren in der Include unter
    #define MAX_TIMER 10


    Welcher Timer welche ID?
    - Der erste Timer in SetMultiTimer hat ID 0, der zweite ID 1 usw..
    - In der Include sind die ersten 10 Timer mit Timer1 für 0, Timer2 für 1 usw. definiert



    Funktionen von MultiTimer


    SetMultiTimer({Float,_}:...);
    // Beispiel:
    SetMultiTimer(1, 2, 5, 10);
    //Startet beliebig viele Timer (in diesem Fall 4 Timer mit 1, 2, 5 und 10 Sekunden)


    StopMultiTimer();
    //Stoppt den MainTimer und somit alle anderen Timer


    StopSingleTimer(TimerID);
    //Stoppt einen einzelnen Timer


    RestartSingleTimer(TimerID, bool:startbyzero = true);
    //Startet einen einzelnen Timer wieder (startbyzero = true startet den Timer bei 0, = false startet, wo man ihn gestoppt hat)


    SetSingleTimerInterval(TimerID, interval);
    //Setzt den Intervall eines einzelnen Timers (Interval in Sekunden)


    OnMultiTimerTick(TimerID)
    //Das Callback für die Timer (TimerID = welcher Timer tickt)


    Bei weiteren Fragen einfach mal schreiben :)


    Download
    Klick mich
    Pastebin

    2 Mal editiert, zuletzt von Rafelder ()

  • 1) Pastebin!
    2) Spart sowas (so gut wie) nichts. Was der samp-Prozess tut, ist, immer den Tickcount mit dem Timerintervall zu vergleichen, Hier passiert eigentlich etwas sehr ähnliches, nur dass es im Script getan wird, also nochmal etwas mehr verbraucht. Dazu ist es noch unkonfortabel - man kann keinen Millsekunden-Timer starten, obwohl das eigentlich eine gute Möglichkeit ist, um die Last gleichmäßig zu verteilen, Beispiel:
    Timer A 1000 ms
    Timer B 3000 ms
    Timer C 6000 ms
    Wenn A ausgeführt wird, wird auch B + C ausgeführt... besser ist:
    Timer A 1007 ms
    Timer B 3019 ms
    Timer C 5971 ms


  • Wenn A ausgeführt wird, wird auch B + C ausgeführt... besser ist:


    Und weiter?
    Pawn ist stack, also werden sie nicht gleichzeitig ausgeführt ;D


    Nice, nur ne frage. Woher weiß man welcher MultiTimer welche ID hat`?
    Sonst zu gebrauchen, 9/10


    SetMultiTimer(1, 3, 5, 8);
    Timer1 = 1
    Timer2 = 3
    Timer3 = 5
    Timer4 = 8
    Also immer die Stelle an der er steht. Und ohne die TimerXY defines ist die erste Stelle "0".

  • Aber genau nacheinander, zwischendurch werden keine anderen Sachen verarbeitet - nennt man Lag

  • Aber genau nacheinander, zwischendurch werden keine anderen Sachen verarbeitet - nennt man Lagg


    So und jetzt erklär mit was passiert wenn ich 3 verschiedene Timer mit SetTimer starte.. genau das gleiche ?
    Die Include ist nicht dazu da um das zu verhindern, sondern um mehrere Timer in einen zu packen.

  • So und jetzt erklär mit was passiert wenn ich 3 verschiedene Timer mit SetTimer starte.. genau das gleiche ?
    Die Include ist nicht dazu da um das zu verhindern, sondern um mehrere Timer in einen zu packen.


    Wenn man ihn mit SetTimer startet kann man +- 100 ms machen... dann am besten Primzahlen verwenden, schon ist dazwischen immer genug Zeit. Das ist halt das problem - hier muss die veränderung mindestens 1000 ms sein, das ist meistens zu viel für sowas...


  • Wenn man ihn mit SetTimer startet kann man +- 100 ms machen... dann am besten Primzahlen verwenden, schon ist dazwischen immer genug Zeit. Das ist halt das problem - hier muss die veränderung mindestens 1000 ms sein, das ist meistens zu viel für sowas...


    Tja aber ich hab noch nicht viele gesehen, die Timer aus diesem Grund mit 1007 ms der 894 ms oder sonst was starten ;D
    Du musst es nicht benutzen, wenns dein Server nicht schafft. :)
    Und wenn ich die Include auf ms umschreiben hab ich leider einen Timer der evtl. unnötig im 1 ms Takt läuft.. viel Spass damit ;D

  • Nunja, wenn du damit keine Lags verhindern willst, was bringt's dann? ?(


  • Wenn man ihn mit SetTimer startet kann man +- 100 ms machen... dann am besten Primzahlen verwenden, schon ist dazwischen immer genug Zeit. Das ist halt das problem - hier muss die veränderung mindestens 1000 ms sein, das ist meistens zu viel für sowas...


    Seh Ich auch so.


    Zitat

    Tja aber ich hab noch nicht viele gesehen, die Timer aus diesem Grund mit 1007 ms der 894 ms oder sonst was starten ;D
    Du musst es nicht benutzen, wenns dein Server nicht schafft. :)
    Und wenn ich die Include auf ms umschreiben hab ich leider einen Timer der evtl. unnötig im 1 ms Takt läuft.. viel Spass damit ;D


    Ich nutz es zB so.
    tAchievments = SetTimer("Achievment_DoShit",((5*1000) + 64),true);
    tVehicleExport = SetTimer("VehicleExport_DoShit",((VEHICLEEXPORT_ROUND_TIME * 1000) - 27),true);
    tStunting = SetTimer("Stunting_DoShit",((30*1000) + 57),true);
    tStuntingGod = SetTimer("Stunting_Infinity",((2*1000) - 91),true);

    Sind jetzt nur Beispiele.
    Zu diesem Thema hat Y_Less mal einen ganz Interessanten Beitrag im SA-MP.COM Forum verfasst.Ich such den mal,da steht drin wieso man es eigentlich nicht so machen sollte, wie es im Include von Rafeleder gemacht wird.
    Wie auch immer, ich sag nicht,dass es schlecht es was du da gemacht hast. Ich hab es ja selber auch so ähnlich lange Zeit selbst gemacht.



    Ich tippe außerdem das Fisch ein Doppelaccount ist,eventuell kleiner_opa :p

  • Ich tippe außerdem das Fisch ein Doppelaccount ist,eventuell kleiner_opa :p


    hm? ich weiß von nichts ?(:whistling: :wacko:


    //Goldkiller: Hast mir zu viel Ahnung,dafür dass du nur paar Post's hast und seit heute registriert ;).

    Einmal editiert, zuletzt von Goldkiller ()