Accueil > Forum > > > > Temps d'attente précis (~ms)
Temps d'attente précis (~ms)
mercredi 18 juillet 2007 à 00:16:14 |
Temps d'attente précis (~ms)

Arateris
|
Bonjour, pour une appli en C/C++, j'aurais
besoin qu'un thread se mette en pause pour une durée courte (1,2,5 ou 10ms) de
facon fiable. Mon but étant de faire un simulateur, cette précision est
importante. En faisant des tests avec des fonctions qui regarde l'heure
: [CODE]
static LARGE_INTEGER freq; static bool
init_fq(false);
double current_time() { if (!init_fq)
{ QueryPerformanceFrequency(&freq); init_fq =
true; } QueryPerformanceCounter(&count);
return static_cast<double>(count.QuadPart) /
freq.QuadPart; }
void attendre(unsigned long time){ double
start = 1000*current_time(); // en
millisecondes. Sleep(1); printf("TIME after:
%f\n",1000*current_time()-start); }
[/CODE]
Je vois qu'un sleep(1) dure environs 1.8 ms
(l'appel de la fonction current_time est négligeable, de l'ordre de la centime
de millisecondes) un Sleep(2) dure 2.8ms également en moyenne (avec des rares
pointes à 17-33ms). J'ai lu de nombreuses fois sur le net que les sleep
courts sont imprécis (et je l'ai bien constaté) puisqu'ils bloquent le thread
pour une durée minimale.
Pour contourner ce problème, j'ai essayé un truc du
genre :
[CODE] void attendre(unsigned long
time){ double start = 1000*current_time(); // en
millisecondes. SetThreadPriority(GetCurrentThread(),15); while
(1000*current_time() < (start+time)){ }
SetThreadPriority(GetCurrentThread(),0); printf("TIME
after: %f\n",1000*current_time()-start); } [/CODE]
J'arrive à obtenir des temps d'attentes tout à fait
raisonnables (1.00ms) et assez stable, mais j'ai également des pointes
ponctuelles au dela des 10-20ms d'attentes. Le fait de changer de priorité le
thread n'a en fait que peu d'influence, surtout que le but n'est pas de bloquer
le reste de la machine sur laquelle tourne une application serveur video et une
socket de réception sur un thread parallèle.
J'ai meme essayé de combiner un Sleep(1) puis while
(1000*current_time() < (start+time)) (pour une attente de 2ms par exemple..)
Là encore je suis la plupart du temps stable, mais avec les mêmes
pointes.
Y a-t-il une solution pour éviter d'avoir des
pointes d'attentes si élevée ou moins fréquement?
Le fait d'avoir 3 choses qui tournent en même temps
sur le pc (Win XPau passage) est surement une des clés du problèmes, mais pas de
la solution. Passer sur un ensemble complètement linéaire
(serveur+socket+appli en un seul thread) résoudrait-il le problème?(ou alors de
toute facon, le fait d'avoir windows et n'importe quoi derrière ca plante
tout..?)
|
|
mercredi 18 juillet 2007 à 01:03:24 |
Re : Temps d'attente précis (~ms)

victorcoasne
|
Bonjour, Pourquoi as-tu besoin d'un traitement toutes les millisecondes. Tu n'es pas tout seul sur le système ;) Soit tu lance une boucle pour conserver les ressources restantes soit tu te créé un système d'exploitation (bonne chance). PS : Ce n'est pas à prendre sur un ton de critique mais sur un conseil disant que le système il faut bien qu'il tourne et que il y a 1000ms dans une seconde toutes ne sont pas réservés à un seul programme [vous me suivez ?]. Merci et bonne prog, @++ Le créateur du site http://victorlogiciels.com
|
|
mercredi 18 juillet 2007 à 10:07:53 |
Re : Temps d'attente précis (~ms)

BruNews
|
Clair qu'un système multi taches préemptif n'est pas fait pour du temps réel mais pour que l'action utilisateur ait toujours priorité.
Il faut y ajouter qu'un appel de fonction n'est pas gratuit, minimum de 4 octets PUSHés (registre EIP). Si comme ici il y a dans cette fonction 2 appels externes et une division en flottant, alors pas de quoi s'étonner qu'on se retrouve loin de la ms.
ciao... BruNews, MVP VC++
|
|
mercredi 18 juillet 2007 à 11:34:30 |
Re : Temps d'attente précis (~ms)
|
mercredi 18 juillet 2007 à 12:41:42 |
Re : Temps d'attente précis (~ms)

rt15
|
Salut, Sur un processeur cadencé à 2GHz, il y a un front d'horloge toutes les 0,000.000.000.5 secondes, et 2.000.000 de fronts d'horloge par millisecondes. Avec ces deux millions de fronts, on peut bien espérer 500.000 instructions sur un mauvais processeur, à partir du moment ou le processeur travail sans attendre le dur ou autre chose. On peut sans problème chronométrer une boucle tournant à quelques dizaines de micro secondes quand elle n'est pas interrompue par un autre thread. Mais bon comme dit plus haut, le préamptif fait que Windows va donner du temps à d'autre thread. Il y a pas de solution gratuites sous XP (LabView...), mais y a des Linux temps réel. La solution pour avoir du (presque) temp réel sous Windows passe probablement par la modification de la config du PIT.A ce que j'ai compris c'est ce compteur qui est responsable de lancer
une interruption IRQ0, et cette interruption lance l'ordonanceur qui
peut avoir l'idée de choisir un autre thread. Ce composant à pas l'air trop compliqué, mais a ce que j'ai compris, il faut passer en adressage réel pour avoir accès aux adresses qui le concerne...
|
|
mercredi 18 juillet 2007 à 14:10:42 |
Re : Temps d'attente précis (~ms)

Arateris
|
J'arrive à obtenir des temps d'attentes tout à fait raisonnables (1.00ms) et assez stable, mais j'ai également des pointes ponctuelles au dela des 10-20ms d'attentes.
Le fait de changer de priorité le thread n'a en fait que peu d'influence, surtout que le but n'est pas de bloquer le reste de la machine sur laquelle tourne une application serveur video et une socket de réception sur un thread parallèle.
J'ai meme essayé de combiner un Sleep(1) puis while (1000*current_time() < (start+time)) (pour une attente de 2ms par exemple..) Là encore je suis la plupart du temps stable, mais avec les mêmes pointes.
Y a-t-il une solution pour éviter d'avoir des pointes d'attentes si élevée ou moins fréquement?
Le fait d'avoir 3 choses qui tournent en même temps sur le pc (Win XPau passage) est surement une des clés du problèmes, mais pas de la solution.
Passer sur un ensemble complètement linéaire (serveur+socket+appli en un seul thread) résoudrait-il le problème?(ou alors de toute facon, le fait d'avoir windows et n'importe quoi derrière ca plante tout..?)
je vais me renseigner sur le PIT..
merci de vos réponse :)
|
|
mercredi 18 juillet 2007 à 14:19:30 |
Re : Temps d'attente précis (~ms)
|
mercredi 18 juillet 2007 à 14:20:49 |
Re : Temps d'attente précis (~ms)

Arateris
|
Oupss problème avant le post précedent.. (on peut pas éditer un post?? si un modo passe par ici, il peut supprimer le message d'avant qui copie-colle mon premier message)
Bon je recommence :
Mon problème n'est pas d'atteindre la milliseconde, ca j'y arrive. Le soucis c'est d'assurer un taux d'erreur minimum. Par taux d'erreur, comprendre timeout trop long.
J'ai bidouillé un peu ma fonction pour integrer le current_time et gagner du temps d'execution...bref
J'ai fait des essais et j'arrive à un taux de timeout > 1.01ms (pour 1ms demandée) qui tourne autour de 1%. ( PC = Windows XP, P4@2GHz, 512Mo)
C'est un taux assez faible, mais mon application a des besoins assez stricts, spécialement, il faut éviter les grosses erreurs, puisque 0,1% des timeout dépassent les 2ms et certains vont jusqu'a atteindre 60ms!
Et comme mon appli fait tourner des milliers de ces timeout..ca arrive forcément un moment ou un autre.
Je vais me renseigner sur PIT.
Je crois malheureusement que je pourrais pas faire grand chose de plus sur windows facilement. (et je suis contraint à utiliser windows..)
en tout cas merci de vos réponses.
|
|
mercredi 18 juillet 2007 à 14:20:51 |
Re : Temps d'attente précis (~ms)

Arateris
|
Oupss problème avant le post précedent.. (on peut pas éditer un post?? si un modo passe par ici, il peut supprimer le message d'avant qui copie-colle mon premier message)
Bon je recommence :
Mon problème n'est pas d'atteindre la milliseconde, ca j'y arrive. Le soucis c'est d'assurer un taux d'erreur minimum. Par taux d'erreur, comprendre timeout trop long.
J'ai bidouillé un peu ma fonction pour integrer le current_time et gagner du temps d'execution...bref
J'ai fait des essais et j'arrive à un taux de timeout > 1.01ms (pour 1ms demandée) qui tourne autour de 1%. ( PC = Windows XP, P4@2GHz, 512Mo)
C'est un taux assez faible, mais mon application a des besoins assez stricts, spécialement, il faut éviter les grosses erreurs, puisque 0,1% des timeout dépassent les 2ms et certains vont jusqu'a atteindre 60ms!
Et comme mon appli fait tourner des milliers de ces timeout..ca arrive forcément un moment ou un autre.
Je vais me renseigner sur PIT.
Je crois malheureusement que je pourrais pas faire grand chose de plus sur windows facilement. (et je suis contraint à utiliser windows..)
en tout cas merci de vos réponses.
|
|
mercredi 18 juillet 2007 à 14:23:40 |
Re : Temps d'attente précis (~ms)

victorcoasne
|
Bonjour, Tu ne me dis toujours pas à quoi va te servir la régularité. Si c'est qu'une histoire de décallage de temps calcule l'action de ton programme en fonction de l'horloge système. Merci et bonne prog, @++ Le créateur du site http://victorlogiciels.com
|
|
Cette discussion est classée dans : temps, time, thread, sleep, current
Répondre à ce message
Sujets en rapport avec ce message
erreur mémoire pour un décompte [ par yeager ]
Bonjourj'ai fait un petit code pour lancer un programme toutes les 30 secondes.Lorsque je lance le débugger, ça marche nichel.Mais lorsque je lance le
comment gérer un sleep() et une siasie de touche en même temps? [ par capunk ]
bonjour, j'ai un programme a faire dont le but est de simuler le fonctionnement d'une mémoire vive.Donc mon soucis c'est qu'il faut que je simule auss
Prob avec Sleep [ par blinkseb ]
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 nomb
Initialisation de structure [ par goutbouyo ]
Salut,J'ai une structure temps:struct temps { float time, elapsedTime, lastTime;};Je l'itinialise :<table border=0 cel
Priorité et thread [ par obasileus ]
Salut, j'ai un programme qui tourne avec 2 thread utilisant une même ressource partagé. Je voudrai privilégier l'execution d'un des deux thread car d
mscoree.dll [ par cosmobob ]
Bonjour, je viens de me rendre compte qu'en compilant un programme avec visual studio 7, l'exe généré est ou bien dépendant de msvcr7x.dll (bibliotheq
Tempo C sous DOS en miliseconde? [ par pcman5 ]
Voila, j'utilise le compilateur QuickC sous DOS et je cherche a faire une temporisation en miliseconde. La fonction Sleep n'existant pas. (En tous cas
Terminer un Thread [ par JejeLand ]
Salut, Je cherche le moyen d'éxéxuter un <span id="google-navclien
Chronometrer le temps d'éxecution d'une fonction en C [ par poiuytrez3 ]
Bonjour, je cherche comment chronometrer le temps d'éxecution d'un tri. Je sais qu'il faut utiliser le fichier time.h avec la fonction time(), j'ai e
Economise le temps machine [ par maddoc2 ]
Bonsoir,Je suis en train de développer une application sous Windows dans laquelle des données à collecter ont deux origines possibles. Chaque origine
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|