Beiträge von Blowfish

    Hallo tdXkiller,


    mein Post bezieht sich eigentlich auf deinen anderen Thread "Mysql Bank Account System schneller machen", habe wohl den falschen Tab beim Schreiben erwischt. Passiert schonmal bei der Uhrzeit :)


    Nun zur Sache. Dein Problem verursacht kurz gesagt der Einsatz von mysql_GetString.


    Du solltest wirklich überdenken ob du diese Funktion weiterhin nutzen möchtest. Wie du bei deinem Problem merkst führt sie bei jedem Aufruf eine neue MySQL Abfrage aus. Jede dieser Abfragen blockiert den Gamemode bis sie beendet ist. Das kann durchaus problematische Ausmasse annehmen. Angenommen eine Abfrage dauert 10 ms und du führst mit mysql_GetString ungewollt 300 Abfragen aus. Dein Server ist dann für 3 Sekunden blockiert, was sich für Spieler in Form von starken Laggs bemerkbar macht.


    Ich bin mir nicht ganz sicher was du für ein MySQL Plugin verwendest, aber ich kann das von BlueG nur empfehlen:
    http://forum.sa-mp.com/showthread.php?t=56564


    Das Plugin von BlueG ermöglicht Abfragen in separaten Threads ausführen zu lassen. Dies hat den großen Vorteil, dass der Gamemode nicht blockiert wird während die Abfrage läuft. Wenn die Abfrage fertig ist wird dann im Gamemode ein Callback aufgerufen, ganz ähnlich wie bei Dialogen und OnDialogResponse.


    Hier ein Beispiel:


    Eine mögliche Abfrage:
    (Code bei Pastebin: http://pastebin.com/7gVA2Q9Y)



    new queryString[128];
    format(queryString, sizeof(queryString), "SELECT `Type`, `Number`, `Nickname` FROM `db_bank` WHERE `user` = %d", playerData[playerid][p_dbid]);
    mysql_function_query(dbHandle, queryString, true, "OnBankReceiveData", "i", playerid);




    In mysql_function_query wird ein Callback für die Abfrage angegeben, in diesem Fall OnBankReceiveData mit dem Parameter
    playerid, also muss dieses noch definiert werden:


    forward OnBankReceiveData(playerid);
    public OnBankReceiveData(playerid) {
    new rows, fields;
    var tmp[32];
    var type, number, nickname[MAX_PLAYER_NAME];


    // Anzahl der zurückgegebenen Zeilen / Spalten herausfinden
    cache_get_data(rows, fields);


    // Schleife über alle Zeilen
    for(i = 0; i < rows; i++) {
    // Erster Parameter ist die Zeile, zweiter die Spalte.
    // Die Abfrage lautet "SELECT `Type`, `Number`, `Nickname` ... ", also
    // ist Type hier die erste, bzw. 0te Spalte.
    // Der Dritte Parameter gibt an wo das Ergebnis zwischengespeichert werden soll.
    cache_get_row(i, 0, tmp);


    // Zwischengespeicherten Wert von String zu Integer umwandeln
    type = strval(tmp);


    cache_get_row(i, 1, tmp);
    number = strval(tmp);


    cache_get_row(i, 2, nickname);


    // ...
    }
    }


    Das soll nur ein kurzes Beispiel sein. Alles weitere kannst du in den Offiziellen Tutorials und in der Dokumentation nachlesen. Die Abfragen so durchzuführen scheint zwar auf den ersten Blick etwas komplizierter zu sein die Abfragen so durchzuführen, aber man gewöhnt sich schnell daran.


    Trotzdem ist es eine Menge Arbeit einen kompletten Gamemode so umzuschreiben, aber ich kann dir versichern, dass es sich lohnt. Vor allen Dingen wenn du noch nicht so viel Code, bzw. nicht so viele Abfragen hast solltest du überlegen den Schritt zu wagen ;) Lass aber in jedem Fall die Finger von diesem mysql_GetString.


    Viele Grüße,
    Hagen



    Ich musste leider auf die Code Tags verzichten. Das Forum entfernt darin komischerweise alle Zeilenumbrüche. Ich nutze einen Mac, vielleicht liegts daran. Wenn das ein Moderator sieht kann er sich ja vielleicht mal der Problematik annehmen ;) Hier nochmal der Code bei Pastebin: http://pastebin.com/7gVA2Q9Y