• 06 Juillet 2025, 17:06:44


Auteur Sujet: Samp et Mysql  (Lu 3976 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Samp et Mysql
« Réponse #15 le: 08 Avril 2010, 17:00:08 »
Tout à fait Jeff.
Il faut donc trouver un mécanisme pour retarder la retarder la deuxième tant que la première n'est pas finie.

Ce qu'il faut avoir en tête c'est que SAMP est événementiel (le script est exécuté en fonction des événements qui se produisent sur le serveur et les différents clients) et que donc il est très courant que deux événements arrivent en même temps. Si ces deux événements font chacun une requête SQL, il y a fort à parier que l'une des deux aura un résultat erroné.

++
Syg
Courtesy of GtaManiac

Hors ligne Jeffreeeey

  • *
  • Tueur
  • Messages: 87
    • Voir le profil
Re : Samp et Mysql
« Réponse #16 le: 08 Avril 2010, 17:01:34 »
Donc j'abandonne le mysql ? et je repasse aux fichiers ? J'ai peur de faire une erreur que je regretterais plus tard.

Hors ligne jordanve

  • *
  • Tueur
  • Messages: 88
    • Voir le profil
    • Arizona City
Re : Samp et Mysql
« Réponse #17 le: 09 Avril 2010, 20:53:56 »
En mettant un timer au login ça peut résoudre ?

Hors ligne Jeffreeeey

  • *
  • Tueur
  • Messages: 87
    • Voir le profil
Re : Samp et Mysql
« Réponse #18 le: 10 Avril 2010, 11:08:33 »
Non c'est pas là le problème car dés que tu te déconnecte il peut y avoir a tout moment une autre requette SQL et c'est pour ça que la variable Argent ce remet a zero :/

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Samp et Mysql
« Réponse #19 le: 11 Avril 2010, 00:23:24 »
Oui Jeff c'est exactement ça le problème.
Et pour éviter que 2 requêtes se fasse en même temps, il faut utiliser un sémaphore (ou mutex=Mutual Exclusive).

Il est très facile de faire un sémaphore acceptable en PAWN, il suffit d'un variable et de deux fonctions :
new MonSemaphore = 0;

PrendreSemaphore ()
{
   /* Tant que le sémaphore n'est pas libre */
   while (Semaphore != 0); // Prendra 100 % d'un CPU tant que Semaphore ne vaudra pas 0

  /* On prend le sémaphore */
  Semaphore = 1;
}

LibererSemaphore ()
{
   Semaphore = 0;
}

Ensuite, il faut appeler PrendreSemaphore avant chaque requête et LibererSemaphore après que le résultat de la requête a été utilisé.

Attention toutefois, avec un sémaphore, si on code de travers, il est possible que le serveur reste bloqué à jamais (dead lock). Notamment dans le cas où on oublie de libérer le sémaphore.
De plus, la fonction PrendreSemaphore va consommer 100 % du CPU tant que le sémaphore ne sera pas libre (=0). C'est moyennement grave sur les machine avec plusieurs cœurs (ou plusieurs CPU) mais il ne faut surtout pas le faire sur une machine avec un seul processeur.

Autre inconvénient, les requêtes sont exécutées les unes après les autres et si, par exemple, 4 joueurs se connectent en même temps, le 4° risque d'attendre plus longtemps que prévu.

++
Syg
Courtesy of GtaManiac

Hors ligne Jeffreeeey

  • *
  • Tueur
  • Messages: 87
    • Voir le profil
Re : Samp et Mysql
« Réponse #20 le: 13 Mai 2010, 21:12:58 »
Je suis desoler de remonter post. Mais que veut dire "si on code de travers" ?

Et franchement je vois pas comment fonctionne ton code, enfaite je vois rien qui dit de faire patienter la requette en attendant la fin de l'autre requette.

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Samp et Mysql
« Réponse #21 le: 17 Mai 2010, 10:40:48 »
Mon code est très simple :

Juste avant une requête SQL, tu appelles PrendreSemaphore ().
Et juste après avoir fini d'utiliser le résultat de la requête, tu appelles LibererSemaphore ().

La fonction PrendreSemaphore ne te rendra la main que lorsque la variable MonSemaphore sera à 0 (à cause du while). Donc si une autre requête est en cours, toutes les autres requêtes seront suspendues.

Quand je dit "coder de travers", je veux dire que si on oublie un seul LibererSemaphore, toutes les requêtes seront suspendue (car MonSemaphore ne reprendra jamais la valeur 0) et donc ton script ne fonctionnera plus.

Il y a d'ailleurs une grosse erreur dans mon bout de script (fait vite fait sur le forum) :
new MonSemaphore = 0;devrait être
new Semaphore = 0;
++
Syg

Courtesy of GtaManiac