#include <a_samp>
#define VALEUR_TIMER 300
forward MonTimer ();
new T1, T2;
main ()
{
}
public OnGameModeInit ()
{
// Set timer of 1 second.
SetTimer ("MonTimer", VALEUR_TIMER, 1);
T1 = GetTickCount ();
return 1;
}
public MonTimer ()
{
T2=GetTickCount();
printf("Difference : %d %%", (T2-T1-VALEUR_TIMER)/(VALEUR_TIMER/100));
T1=T2;
}
#include <a_samp>
#define VALEUR_TIMER 853
forward MonTimer ();
main ()
{
}
public OnGameModeInit ()
{
// Set timer of 1 second.
SetTimer ("MonTimer", VALEUR_TIMER, 1);
return 1;
}
public MonTimer ()
{
printf ("GetTickCount = %d", GetTickCount());
}
MonSetTimer (Fonction[], Intervalle, Repetition)
{
SetTimer (Fonction, Intervalle/1.172, Repetition);
}
Code: [Sélectionner] [12:34:34] Difference : 8 % |
#include <a_samp>
#define VALEUR_TIMER 300
forward MonTimer ();
new T1, T2;
main ()
{
}
public OnGameModeInit ()
{
SetTimer("MonTimer",VALEUR_TIMER,1);
return 1;
}
public MonTimer ()
{
T1 = GetTickCount();
printf("Ms ecouler %d",T1 - T2);
T2 = T1;
}
Ms ecouler 1145608
Ms ecouler 333
Ms ecouler 332
Ms ecouler 338
Ms ecouler 331
Ms ecouler 332
Ms ecouler 334
Ms ecouler 335
Ms ecouler 319
Ms ecouler 307
Ms ecouler 463
Ms ecouler 320
Ms ecouler 349
Ms ecouler 373
Ms ecouler 324
Ms ecouler 323
Ms ecouler 326
Ms ecouler 331
Ms ecouler 335
Ms ecouler 336
Ms ecouler 326
Ms ecouler 330
Ms ecouler 329
Ms ecouler 388
Ms ecouler 340
Ms ecouler 373
Ms ecouler 321
Ms ecouler 344
Ms ecouler 331
Ms ecouler 328
Ms ecouler 335
Ms ecouler 328
Ms ecouler 326
Ms ecouler 329
Ms ecouler 331
Ms ecouler 334
Ms ecouler 331
Qu'est-ce que vient faire l'OS là-dedans ?
Oh mais l'OS a tout à faire là-dedans : c'est lui qui contrôle les programmes qui tournent !
Votre programme va donc dire à l'OS : "Je dors, réveille-moi dans 1 seconde". Mais l'OS ne va pas forcément le réveiller au bout d'une seconde exactement.
En effet, il aura peut-être un peu de retard (un retard de 10ms en moyenne environ, ça dépend des PC). Pourquoi ? Parce que votre CPU ne peut travailler que sur un programme à la fois. Le rôle de l'OS est de dire au CPU ce sur quoi il doit travailler : "Alors, pendant 40ms tu vas travailler sur firefox.exe, puis pendant 110ms tu vas travailler sur explorer.exe, et ensuite pendant 80ms tu vas travailler sur programme_sdl.exe, puis tu vas retravailler sur firefox.exe pendant 65ms" etc etc...
L'OS est le véritable chef d'orchestre de l'ordinateur !
Maintenant, imaginez qu'au bout d'une seconde un autre programme soit encore en train de travailler : il faudra qu'il ait fini de travailler pour que votre programme puisse "reprendre la main" comme on dit, c'est-à-dire être traité à nouveau par le CPU.
Tout ça pour dire quoi ? o_O
Ooops, excusez-moi j'étais en train de dériver :-°
En gros, j'essayais de vous expliquer que votre CPU ne pouvait pas gérer plus d'un programme à la fois. Pour donner l'impression que l'on peut faire tourner plusieurs programmes en même temps sur un ordinateur, l'OS "découpe" le temps et autorise les programmes à travailler au tour par tour.
Or, cette gestion des programmes est très complexe et on ne peut donc pas avoir la garantie que notre programme sera réveillé au bout d'une seconde exactement.
Toutefois, ça dépend des PC comme je vous l'ai dit plus haut. Chez moi, la fonction SDL_Delay est assez précise.
A cause de ce problème de "granularité du temps", vous ne pouvez donc pas mettre en pause votre programme pendant un temps trop court. Par exemple, si vous faites :
Code : C
1
SDL_Delay(1);
Vous pouvez être sûrs que votre programme ne sera pas mis en pause 1ms mais un peu plus (peut-être 9-10ms).
En résumé : SDL_Delay c'est cool, mais ne lui faites pas trop confiance. Elle ne mettra pas en pause votre programme pendant le temps exact que vous indiquez.
Ce n'est pas parce que la fonction est mal codée, c'est parce que le fonctionnement d'un ordinateur est très complexe et ne permet pas d'être très précis à ce niveau.
Ms ecouler 1111
Ms ecouler 1117
Ms ecouler 1105
Ms ecouler 1109
Ms ecouler 1110
Ms ecouler 1110
Ms ecouler 1116
Ms ecouler 1107
Ms ecouler 1074
Ms ecouler 1096
Ms ecouler 1119
Ms ecouler 1115
Ms ecouler 1116
Ms ecouler 1110
Ms ecouler 1101
Ms ecouler 1113
Ms ecouler 1117
Ms ecouler 1109
Ms ecouler 1108
Ms ecouler 1112
Ms ecouler 1101
#include <stdio.h>
#include <windows.h>
VOID CALLBACK MaFonctionTimer (HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
/* Fonction nécessaire mais non utilisée */
}
void main (void )
{
HWND hwndTimer;
MSG msg;
if (SetTimer (NULL, 0, 1000, MaFonctionTimer)==0)
{
printf ("Impossible de creer le timer\n");
}
while (GetMessage(&msg, // message structure
NULL, // handle of window to receive the message
NULL, // lowest message to examine
NULL)) // highest message to examine
{
// Post WM_TIMER messages to the hwndTimer procedure.
if (msg.message == WM_TIMER)
{
msg.hwnd = hwndTimer;
printf ("GetTickCount = %d\n", GetTickCount ());
}
TranslateMessage(&msg); // translates virtual-key codes
DispatchMessage(&msg); // dispatches message to window
}
}
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Temps pour timer d' une seconde = 1014
Ms ecouler 2207
Ms ecouler 2224
Ms ecouler 2224
Ms ecouler 2241
Ms ecouler 2227
Ms ecouler 2237
Ms ecouler 2213
Ms ecouler 2204
Ms ecouler 2224
Ms ecouler 2212
Ms ecouler 2209
Ms ecouler 2220
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2013
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2013
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2013
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2013
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2013
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2012
Temps pour timer d' une seconde = 2013
8:52:29] Time elapsed: 385927
[18:52:30] Time elapsed: 386950
[18:52:31] Time elapsed: 387993
[18:52:32] Time elapsed: 389085
[18:52:33] Time elapsed: 390056
[18:52:34] Time elapsed: 391112
[18:52:35] Time elapsed: 392148
[18:52:36] Time elapsed: 393202
[18:52:37] Time elapsed: 394256
[18:52:38] Time elapsed: 395306
[18:52:39] Time elapsed: 396344
[18:52:40] Time elapsed: 397402
[18:52:41] Time elapsed: 398400
[18:52:42] Time elapsed: 399437
[18:52:44] Time elapsed: 400494
[18:52:45] Time elapsed: 401550
[18:52:46] Time elapsed: 402603
[18:52:47] Time elapsed: 403655
[18:52:48] Time elapsed: 404800
[18:52:49] Time elapsed: 405786
[18:52:50] Time elapsed: 406815
[18:52:51] Time elapsed: 408012
[18:52:52] Time elapsed: 408897
[18:52:53] Time elapsed: 409928
[18:52:54] Time elapsed: 411024
[18:52:55] Time elapsed: 412050
[18:52:32] Time elapsed: 389085
[18:52:33] Time elapsed: 390056
...
[18:52:51] Time elapsed: 408012
[18:52:52] Time elapsed: 408897
...
[18:52:50] Time elapsed: 406815
[18:52:51] Time elapsed: 408012