Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Temporiser une boucle

13 réponses
Avatar
Ragnartichaud
En C++, je cherche à trouver le moyen de placer un condition sur le temps
d'éxécution d'une boucle : par exemple
si (temps d'execution < 50 ms ) { wait } else { continue }
je v m'en servir pour un programme qui va afficher une série d'images et je
vois pas trop comment faire pour "brider" le programme .

merci

3 réponses

1 2
Avatar
Cyrille Szymanski
On 2004-04-26, HalfWolf wrote:

Non, si on travaille en non signé (en signé on aura des surprises).
Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le
résultat qu'on attendait.



Bon je détaille un peu plus au cas où certains ne comprennent pas :
pour faire une soustraction on fait une addition du complément à 2

a - b = a + cpa2( b )

et cpa2( x ) = ~x + 1

0x32 - 0xFFFFFFFF = 0x32 + ( ~0xFFFFFFFF + 1 )
= 0x32 + ( 1 )
= 0x33

Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste
l'interprétation qui est donnée du nombre.

Donc tant que ton delta est < 0x80000000 même en signé t'aura pas de
problème. Après le hic c'est que le bit de poids fort est à 1 car le
delta est "trop grand", et c'est interprété comme un nombre négatif.

Supposons par exemple ticks2 - ticks1 = 0x80001234.

if ((ticks2 - ticks1) < 50)



C'est négatif donc le test est vrai.

{
Sleep(50 - (ticks2 - ticks1));



50 - 0x80001234 = 50 + (~0x8001234 + 1)
= 50 + (0x7ffedcb + 1)
= 0x7ffedfe
ce qui n'est pas vraiment une bonne valeur pour le sleep.

}
}




--
cns
Avatar
halfwolf
Cyrille Szymanski wrote in message news:<408d4fe5$0$20151$...
On 2004-04-26, HalfWolf wrote:

> Non, si on travaille en non signé (en signé on aura des surprises).
> Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le
> résultat qu'on attendait.

Bon je détaille un peu plus au cas où certains ne comprennent pas :
pour faire une soustraction on fait une addition du complément à 2

a - b = a + cpa2( b )

et cpa2( x ) = ~x + 1

0x32 - 0xFFFFFFFF = 0x32 + ( ~0xFFFFFFFF + 1 )
= 0x32 + ( 1 )
= 0x33

Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste
l'interprétation qui est donnée du nombre.



Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé,
je pensais au test par rapport à 50, qui risque de faire ce que tu as
décris après.

De façon générale, GetTickCount retourne un DWORD et je trouve qu'il
est malsain de stocker le retour dans un INT.
Après, le résultat d'une soustraction de 2 DWORDs, il faut voir en
fonction du comportement attendu.
Ici il vaut mieux exprimer le résultat en DWORD, ça permet, comme tu
l'as démontré, d'utiliser la particularité du modulo pour faire
fonctionner le programme dans tous les cas.

HalfWolf
Avatar
Cyrille Szymanski
On 2004-04-27, HalfWolf wrote:

Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé,
je pensais au test par rapport à 50, qui risque de faire ce que tu as
décris après.



Oui oui je voulais pas remettre en doute tes propos, très justes au
passage mais apporter quelques précisions.

Parce qu'au fond c'est pas insurmontable à comprendre et ça me choque
que beaucoup de gens pensent le contraire.

--
cns
1 2