• 14 Mai 2024, 22:18:13


Auteur Sujet: Les timers...  (Lu 2835 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Les timers...
« le: 22 Mai 2014, 22:33:41 »
Coucou et me revoilà !

Donc aujourd'hui pas vraiment de problème par rapport à d'habitude, mais quelque chose que j'avais réalisé il y a pas mal de temps, c'est que les timers sur SA-MP ont une durée qui n'est pas celle qu'on leur attribue.

Par exemple, lorsqu'on démarre un timer d'une minute par exemple, il n'est jamais d'une minute, mais plutôt de quelque chose comme une minute, et quelques secondes.
Les minutes sont donc plus longues que prévues !

Donc par exemple pour une horloge. On aura tendance à faire la plupart du temps un timer d'une minute au terme du quel la fonction d'actualisation du textdraw (ou autre) sera appelée, ou bien seconde, mais le principe reste le même.

Donc SetTimer("UpdateClock", 60000, true);, mais dans ce cas, il s'agira de 64 secondes au lieu de 60.
Maintenant par exemple, il y a des serveurs où des heures sont 'programmées' pour avoir une action, par exemple, un Jour de paie à xxh00 !
Mais imaginons que la dernière fois où UpdateClock aura été appelée était à l'heure réelle de xx-1h59 et 58 secondes !
Le cadran in game affichera xx-1h59, mais lors de la prochaine échéance du timer, l'horloge passera directement de xx-1h59 à xxh01, ce qui dans le cas énoncé peut être frustrant de redevoir attendre une heure.

Même si ça peut paraître assez minime, j'aime pas l'idée que ça se passe comme ça, les bugs doivent être éradiqués !

Donc, ma question, quelqu'un aurait-il un coefficient x tel que (t = temps imputé au timer && ms = millisecondes passées réellement) ms = xt ?!
Et sinon, comment pourrait-on obtenir une valeur exacte et pas un truc genre 16/15 (64/60) !
Avec une fonction Gettickcount (que je ne maîtrise malheureusement pas) en même temps qu'un timer ?!

Enfin celui qui me trouve ça aura un dessin plein de coeurs de ma part !

Alors petit edit ! Finalement je me suis rendu compte que j'étais un imbécile, que GetTickCount c'était super facile à utiliser, une simple soustraction entre deux nombres, à la fin du timer moins au lancage du serveur !

J'ai donc lancé un petit timer de 20 heures, je vous transmettrai les résultats précis de mon enquête !
« Modifié: 22 Mai 2014, 23:12:57 par CarCrasher »

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Les timers...
« Réponse #1 le: 22 Mai 2014, 23:15:49 »
Salut, je te déconseille GetTickCount() car cette fonction atteint la limite d'une variable PAWN (32 bits) en 24 jours.

Utilise la fonction gettime().

Code: (pawn) [Sélectionner]
new g_iLastPayCheckTime = gettime();

// 3600 secondes = 1 heure
if(gettime() - g_iLastPayCheckTime >= 3600)
// blahblah



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Re : Les timers...
« Réponse #2 le: 22 Mai 2014, 23:34:01 »
Arf, j'avais vu ça, mais je me suis dit que vu que je lance pas un timer de 24 jours ^^'
Mais c'est plutôt tickcount à la limite je dirais, parce que gettime, c'est pour obtenir l'heure réelle (heure, minute, secondes)

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Les timers...
« Réponse #3 le: 23 Mai 2014, 12:25:44 »
gettime permet de récupérer le timestamp aussi : http://wiki.sa-mp.com/wiki/Gettime

GetTickCount : http://wiki.sa-mp.com/wiki/GetTickCount

GetTickCount will cause problems on servers with uptime of over 24 days (SA:MP server, not physical server !!!) as GetTickCount will eventually warp past the integer size constraints

Si ton serveur est allumé depuis 24 jours, tes "timers" ne fonctionneront plus normalement.



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Re : Les timers...
« Réponse #4 le: 24 Mai 2014, 00:47:12 »
Recoucou les enfants !

J'ai donc créé cette fonction !

Code: (pawn) [Sélectionner]
GetRealTimerValue(time)
{
new Float:a, b;
a = floatdiv(floatmul(time, 3600000), 3985161);
a = floatsqroot(floatpower(a, 2));
b = floatround(a, floatround_round);
return b;
}

Donc je m'explique !
On crée deux variables, un float et un int.
Le float va servir à avoir une plus grande variable, car les nombres peuvent devenir vachement grand vu qu'on calcule en milli-secondes, et corrigez moi si je me trompe, mais le Float permet d'avoir de pouvoir rajouter plus de nombres !

Notre coefficient pour rester dans une certaine limite est de 3600000/3985161 !
Donc, nous divisons le produit du paramètre temps par 3600000 par 3985161.
Nous faisons une racine carrée du carré de ce nombre, pour écarter tout risque de nombres négatifs !
Et finalement, on arrondi tout ces nombres en une variable simple, et c'est envoyé !

Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : Les timers...
« Réponse #5 le: 24 Mai 2014, 00:57:22 »
Juste une précision, les variables de type Float ne permettent nullement d'enregistrer de plus grands nombres, mais simplement des nombres à virgule.

Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Re : Les timers...
« Réponse #6 le: 24 Mai 2014, 17:52:01 »
Donc, pour calculer de gros timers, bah, je peux rien faire, sauf les faire à la calculatrice, et les écrire directement dans le SetTimer(Ex) ?

Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : Les timers...
« Réponse #7 le: 24 Mai 2014, 18:11:53 »
Tu peux toujours utiliser une librarie pour manipuler des grands nombres.

Exemple: numlib-samp/numlib.inc at master · lassir/numlib-samp · GitHub

Ici, les nombres ne sont en faite que des chaînes de caractères, je précise que ce n'est pas très optimisé.

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Les timers...
« Réponse #8 le: 31 Mai 2014, 04:16:14 »
Salut,

petit commentaire en passant,

une telle enquête avait déjà été faite avec les versions précédentes de SA:MP sur le forum officiel et on arrive avec un petit problème:

Le décalage temporel dépend de la machine.

On peut toutefois rapidement déterminer le ratio au lancement du serveur en lançant un timer d'une durée connue et en évaluant le temps réel requis etc... et ainsi ajuster le ratio au démarrage du serveur!

++Sim++





Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Les timers...
« Réponse #9 le: 31 Mai 2014, 13:43:05 »
Le décalage dépend de beaucoup de facteur.

http://www.gtaonline.net/forums/index.php/topic,14740.msg270413.html#msg270413

Tout simplement parce que, cela dépend du nombre de joueurs (la durée d'exécution de la fonction de synchro des joueurs), le temps d'exécution des callbacks, etc ..

Vu que toute cette partie (synchro données, exécution des scripts) est dans un seul et même thread, plus l'exécution d'un système est long, plus les timers seront moins précis.



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne NatiVe™

  • *
  • Messages: 7977
    • Voir le profil
Re : Les timers...
« Réponse #10 le: 31 Mai 2014, 14:25:44 »
Le décalage dépend de beaucoup de facteur.

Pour ça, il faut demander à AcidTech.

NV.


Tu vois avant? Bah j'étais là encore avant!

Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Re : Les timers...
« Réponse #11 le: 31 Mai 2014, 16:13:25 »
Donc, c'est pas un simple petit calcul qui va résoudre ça, mais plutôt un calcul d'énormément de paramètres, d'ailleurs pour certains, comme la synchro par exemple etc., il vaudrait mieux directement utiliser un plugin car le pawn ne permet pas assez pour avoir le contrôle dessus ? :cry: