[ MAKRO ] Sleep Funktion

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
  • Guten Mittag euch allen,


    ich habe mich mal ein bisschen umgeschaut und gesehen, dass einige Personen nach einer sleep Funktion in Pawn suchen.
    Doch wie sie festgestellt haben gibt es sowas wie in Java (Thread.sleep(1000);) nicht...


    Also habe ich mal so eine Funktion geschrieben:


    1. Beispiele:


    Also, so funktioniert die Funktion:


    public OnGameModeInit() //Mal als Beispiel genommen
    {
    print("test"); //Wird normal ohne Verzögerung aufgerufen
    sleep(1000)<a>; //Hier findet ein Timeout von 1000ms statt
    print("test2"); //Dann wird das geprintet
    sleep(1000)<b>; //Wieder Timeout von 1000ms
    print("test3"); //und dann wird geprintet
    return 1;
    }


    //Oder wenn man Parameter noch übergeben will
    public OnPlayerConnect(playerid) //Mal als Beispiel
    {
    SendClientMessage(playerid,-1,"hi");
    pSleep(1000)<a,"i",playerid>; //Unten ist eine nähere Erklärung
    SendClientMessage(playerid,-1,"hallo nach 1000ms!");
    }


    2. Nähere Funktions Erklärung


    Also, das sleep(1000)...sollte jedem klar sein ^^ sleep so heißt halt die Funktion und 1000 ist das Attribut für die Millisekunden von dem Timeout :)
    Was ich dann noch gemacht habe, z.B. dieses <a> steht für den Namen des Callbacks der Aufgerufen wird, sobald der Timeout zuende ist!


    Wichtig: Das darf nicht doppelt vorkommen, man kann in einem Script nicht 2x <a> machen oder 2x <b>, diese Reihe weiter fortführen!! Egal wie! Nichts doppelt machen!
    Einfach so: <a>, dann <b>, dann <c>,...usw und wenn man dann 26 Buchstaben durch hat, dann <aa>, <bb> usw :)


    Zu pSleep, ist zu sagen, dass mit dem "i" ist halt wie bei SetTimerEx und steht für den Typ der Variable (i = Integer) und danach kommen halt die ganzen Variablen.
    //Wenn man mehr Variablen übergeben will, macht man einfach:
    pSleep(1000)<a,"ii",playerid,x);


    3. Source Code:


    Der Source Code beschränkt sich nur auf ein kleines Makro, was ihr oben im Script einfügen könnt und sieht folgender maßen aus:


    //(c) by Kaliber
    #define sleep(%0)<%1>; SetTimer("@sleep_"#%1#,%0,0); return 1;}\
    @sleep_%1();@sleep_%1() {


    #define pSleep(%0)<%1,%2,%3>; SetTimerEx("@sleep_"#%1#,%0,0,%2,%3); return 1;}\
    @sleep_%1(%3);@sleep_%1(%3) {


    4. Schlusswort
    Ich würde mich über ein kleines Feedback freuen :)


    mfg. :thumbup:


    //Edited: pSleep

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    Einmal editiert, zuletzt von Kaliber ()

  • Sharpadox:


    denk dir mal das Makro als Code.


    Sein Code sieht beim compilieren so aus
    public OnGameModeInit() //Mal als Beispiel genommen
    {
    print("test"); //Wird normal ohne Verzögerung aufgerufen
    SetTimer("@sleep_a",1000,0);
    return 1;
    }
    forward sleep_a();
    public sleep_a()
    {
    print("test2"); //Dann wird das geprintet
    SetTimer("@sleep_b",1000,0);
    return 1;
    }
    forward sleep_b();
    public sleep_b()
    {
    print("test3"); //und dann wird geprintet
    return 1;
    }
    :thumbup:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Wie sieht es denn aus, wenn ich das ganze in einer Schleife mache? Dann wird der Timer ja auch immer wieder gesetzt...


    Das ist nicht für Schleifen ausgelegt...nur für Localen Code der 1. Ebene :D


    Genauso if-Bedingungen oder ähnliches ist hier nicht möglich...man muss dafür dann halt eine neue Instanz aufrufen.


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ich habe nochmal eine Funktion hinzugefügt, damit man auch die Parameter von der Ursprungs Funktion nutzen kann :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ändert aber nichts daran das dass ganze ein Codeschnipsel ist?


    Das ist richtig.
    Alledrings sehe ich für diesen Code kein Problem, es in diesem Thread zu belassen.


    Falls fragen o.ä. sind kann man sie stellen und wenn es wirklich jemand benötigt, dann findet man es auch deutlich schneller als im Codeschnipsel Thread :thumbup:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Als kleine Anmerkung in Pawn ist es möglich die funktion sleep auszuführen bewirkt jedoch eine Fehlerausgabe in der Serverlog.


    Was dazu auch mal interessant wäre ist goto zu studieren und vllt ein opcode via emit zu generieren um zu dem pointer zu gelangen.

  • Was dazu auch mal interessant wäre ist goto zu studieren und vllt ein opcode via emit zu generieren um zu dem pointer zu gelangen.


    Hatte auch an diese beiden Möglichkeiten gedacht ;)


    Jedoch, ist das mit goto nicht möglich, da es ja einfach an einen Punkt springt, sprich:


    stop:
    print("test");
    goto stop;


    //Was leider nicht geht ist folgendes:
    stop:
    print("test");
    SetTimer("test",1000,0);


    public test() {
    goto stop;
    }


    Da kann man keinen Sleep machen, außer man lässt das so lange irgendwie springen bis eine bestimmte anzahl von ms vorbei ist, aber dann hängt der Server weil die CPU Auslastung bei 100% liegt :D


    Mit emit, ist das leider nicht möglich direkt wieder an einen bestimmten Punkt im Code zu springen...Das funktioniert nur in strings ^^


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Also an sowas wie dein beispielcode habe ich auch gedacht
    Einen timer aufrufen eine abgeänderte version von goto nutzen
    Via emit um zu einem bestimmten punkt zu gelangen. Die idee
    Müsste theoretisch möglich sein auch die funktionen haben eine reihenfolge und warum sollte sich ein locales prinzip nicht global anwenden lassen. Ich sag es mal so nix ist unmöglich du hast einfach nicht das wissen dazu sowas umzusetzen ich auch nicht dazu müsstest du die .amx studieren da das problem zum einen der pointer ist auf den zugegriffen wird und zum anderen die position zu ermitteln.
    Jedoch wäre es erstmal sinnvoll goto nachzuahmen.
    Obwohl ich sagen muss die .asm datei gibt nicht soviel her jedoch gibts ja noch decompiler womit du dein skript editieren kannst auf opcode basis.

  • Mal ne doofe Frage, was bringt das jetzt eig?


    Naja, so ist es z.B. einfacher und übersichtlicher ein Tutorial Mode zu erstellen oder bestimmte Nachrichten halt erst ab ner Bestimmten Zeit zu senden allgemein...
    Naja, macht halt das, was die sleep Funktion bewirken soll, den Code kurz pausieren und ab einer bestimmten Zeit weiterfortführen ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen