Prob avec Sleep

blinkseb Messages postés 57 Date d'inscription mercredi 25 août 2004 Statut Membre Dernière intervention 18 avril 2005 - 9 oct. 2004 à 21:51
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 10 oct. 2004 à 18:01
Bonjour à tous,

j'ai besoin de tracer un cercle (en réalité c'est une ellipse mais le prob reste le même !) en un certain temps.

Je calcule dont le nombre de point nécessaire au tracer du cercle, puis le temps a mettre pour tracer chaque point.

Donc, dès que je place un point avec SetPixel, je fais après un Sleep() avec comme argument le temps à attendre avant de devoir tracer l'autre point.

Ca marche très bien sur mon ordi ! Mais pas sur mon autre. Le tracer ne se termine pas. En faite, je boucle jusqu'a ce que kle temps soit écoulé, et a ce moment là, le tracer doit être fini, mais ce n'est pas le cas sur l'autre ordi.

Il semblerai que Sleep() attende une voire deux millisecondes de trop ce qui fait perdre facilement 1 à 2 secondes à la fin du tracer, ce qui expliquerait pourquoi le tracer n'est pas fini.

Avez vous des idées pour que je puisse attendre exactement le bon nombre de millisecondes ?

Merci d'avance!

bLiNkSeB - Anciennement sebastienbro

9 réponses

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
9 oct. 2004 à 22:02
moi aussi j'ai eu des problemes avec les sleeps, en fait sleep n'est pas portable, il depend de la rapidite de ton systeme, utilise GetTickCount qui lui est sur de marcher INDEPENDEMMENT de la machine.
0
blinkseb Messages postés 57 Date d'inscription mercredi 25 août 2004 Statut Membre Dernière intervention 18 avril 2005
9 oct. 2004 à 22:06
J'utilise GetTickCount() pour savoir le temps déjà écoulé, mais comment l'utiliser pour attendre quelque chose ?

Ceci marche ?


int T1, T2

pour attendre 10 ms

T1 = GetTickCount();
T2 = 0;

while (T2 < 12)
{

       T2 = GetTickCount() - T1;

}



Merci

bLiNkSeB - Anciennement sebastienbro
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 oct. 2004 à 23:09
Cette (mauvaise) solution va utiliser ton UC a 100%, normalement Sleep doit bien marcher. J'ai déj entendu parler de fonctions de l'API Win32, mais j'arrive pas a les retrouver
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 oct. 2004 à 02:20
essaye de faire le traitement dans l'autre sens : tracer un certain nombre de points en un temps donné, 20 ms par exemple et le tracé devrait être fluide. pour éviter des arrondis des divisions, il faudrait voir en fonction du temps actuel le nombre de points sensé avoir été tracé et les afficher.

GetTickCount() donne le temps en ms

QueryPerformanceCounter et QueryPerformanceFrequency donnent des temps + précis.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blinkseb Messages postés 57 Date d'inscription mercredi 25 août 2004 Statut Membre Dernière intervention 18 avril 2005
10 oct. 2004 à 10:02
Utiliser l'UC à 100% ne me gène pas particulièrement, ce programme doit n'être utilisé qu'une seule fois pour les TPE, alors si ça mache comme ça.

Pour ymca2003, je ne vois pas comment faire autrement que comme je fais, étant donné que je possède l'équation polaire et que j'augmente l'angle de 0.01 rad à chaque tour.

bLiNkSeB - Anciennement sebastienbro
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
10 oct. 2004 à 10:55
tu es en main ou en WinMain ? car si tu es en WinMain, tu peux faire des WM_TIMER, sinon l'utilisation de boucles est inevitable ...
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 oct. 2004 à 12:11
ce que je voulais dire c'était de ne pas tracer un point puis d'attendre qqs ms car tu risque de dépasser le temps de 1 à 2 ms à chaque point, mais de faire une boucle dans laquelle tu as une petite pause (Sleep(10) par ex), de récupérer le temps courant, de la comparer avec le temps de début et de calculer le nombre total de points (ou l'angle total) qu'il faudrat avoir tracer à ce moment là et de les tracer d'un coup.

tempsdépart = GetTickcount()
angletotal = 0
while(angletotal < anglefin)
{
sleep(10;
difftemps = GetTickCount()-tempsDepart;
angleSuppose = anglefin/delta1;
while(angleTotal < anglesuppose && angletotal<anglefin)
{
tracerpoint(angletotal);
angletotal+= delta2;
}
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 oct. 2004 à 12:28
JCDjcd> main ou WinMain, peu importe, du moment qu'on inclue <windows.h>, mais on utilisera lpTimerFunc au lieu de nIDEvent.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
10 oct. 2004 à 18:01
oui ca marche aussi, mais le probleme c'est que ton programme continue alors que tu n'as pas fini de tracer le cercle.
0
Rejoignez-nous