begin process at 2012 05 30 18:36:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

Temps d'attente précis (~ms)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Administrateur CodeS-SourceS
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)

victorcoasne

Membre Club
Bonjour,

Je ne dirais pas mieux que notre expert ASM.

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
mercredi 18 juillet 2007 à 12:41:42 | Re : Temps d'attente précis (~ms)

rt15

Membre Club Administrateur CodeS-SourceS
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)

victorcoasne

Membre Club
Bonjour,

C'est quoi l'intérêt d"une opération toute les millisecondes ?

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
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

Membre Club
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

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 7,223 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales