IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[Windows] Un sleep de l'ordre de la microseconde


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut [Windows] Un sleep de l'ordre de la microseconde
    bonjour,
    Je cherche à réaliser des pauses dans un programme de l'ordre de la microseconde.
    Sous certains OS, on peut trouver cela en standard (usleep, nanosleep)
    Mais sous windows, j'ai beau cherché je ne trouve pas grand chose en standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define usleep(x) Sleep(x/1000) ... Ah non ca ne va pas marcher.
    Il y a aussi le select (je viens de le voir dans un post antérieur), mais rien ne ganrantit que ca marche. (je n'ai pas testé...)

    Bref, N'y a-t- il aucune méthode pour le faire ?

  2. #2
    Expert confirmé
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Par défaut
    sleep(0) ca ne fonctionne pas? Ca laisse juste le temps de donner la main

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut
    Salut,
    j'ai lu (sur internet) une remarque sur l'utilisation de sleep(0) qui interrompt le thread en cours (au minimum je crois me souvenir que l'interruption est de 6µs et max 150µs mais je ne suis pas certain des valeurs, mais il est vrai que nous sommes de l'ordre de la µs)

    Cependant, dans mon cas je désire spécifier le temps d'attente.
    je veux pouvoir faire varier ce temps d'attente entre [1microseconde et 1 milliseconde]

    La solution proposée n'est donc pas utilisable...

    PS: J'ai essayé de faire fonctionner via un select mais c'est pas propre et devoir définir une socket etc. etc C'est pas top.
    C'est tout de même surprenant que ce ne soit pas standard sous Windows (seulement la milliseconde !) Alors que sur d'autres OS, le standard est de l'ordre de la NANOsecondes !)

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    En même temps Windows (quel est ta version en fait ?) n'est pas un OS avec un noyau temps réel ce qui veut dire que tu ne peux pas spécifier une attente < a la milliseconde parce que le système ne sait pas le faire...

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut
    quel est ta version en fait ?
    Windows XP

    n'est pas un OS avec un noyau temps réel ce qui veut dire que tu ne peux pas spécifier une attente < a la milliseconde parce que le système ne sait pas le faire...
    Remarque très constructive.
    Mais alors je me pose la question suivante:
    Sur linux (admettons une redHat), j'ai la possibilité de le faire (via usleep, nanosleep). son noyau n'est pourtant pas du temps réel ? (c'est une version standard que j'utilise (pas une version linux temps réel utilisé en embarqué par exemple)

    Merci en tout cas de suivre ce sujet (pauvre en réponse et information)

  6. #6
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Dans des OS non temps réels, le fait que la fonction existe n'indique pas que le délai est respecté...
    usleep(20) indique que la tache s'endort pour au moins 20 µs

  7. #7
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Disons plutot que si windows ne fourni pas de usleep, c'est surement car la precision n'est pas garantie.

    Pour le sleep non plus, d'ailleurs, aucune garantie.

    Mais si la precision moyenne est, mettons, de 20 microsecondes, c'est suffisant pour faire un sleep(milisecondes)

    La precision moyenne du timer de windows doit etre trop grande pour se permettre de compter dessus lors d'un usleep...

    Sous linux, la fonction est implementée, mais avec quelle precision ?

    Ca depend surement de comment tu le configures et de la distribution que tu utilises...

    ---------

    Sinon, il y a peut-etre une autre solution (qui permet d'augmenter artificiellement la precision du timer) :

    Tu declenche un timer à une frequence elevée mais acceptable (genre toutes les 10 millisecondes) et à chaque appel tu faire un appel à getTimerSystem (ou une fonction du meme genre) qui te renvoit le temps systeme (generalement en microsecondes)

    A chaque appel, tu fait la difference avec le temps systeme precedent, ca te donne le nombre de microsecondes qui se sont ecoulées...

    Comme ça, meme si une action a enormement ralentit le systeme et que des appels n'ont eu lieu que toutes les 10secondes, tu gardes quand meme la precision....


    Cette technique m'a permis d'avoir une bonne precision en Java : je souhaiter deplacer un dessin à l'ecran toutes les 15ms.

    En declenchant un timer toutes les 15ms, l'animation était sacadée (un coup 15ms, un coup 20, un coup 10)

    En comptant le temps ecoulé entre deux appels, j'ai pu interpoler mon mouvement en fonction de ça et j'ai obtenu une animation visiblement plus fluide et surtout le dessin mettait exactement 4 secondes pour aller d'un bout à l'autre de l'ecran, à la miliseconde pres !

    Voila, si ca peut t'inspirer une solution, tant mieux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/01/2013, 21h02
  2. Ordre des window.addEvent
    Par arcanum dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/03/2008, 18h26
  3. ordre d'affichage avec window.print()
    Par afrodje dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/09/2007, 12h21
  4. Réponses: 6
    Dernier message: 15/05/2006, 11h50
  5. Fonction sleep sous Windows
    Par Veve44 dans le forum C
    Réponses: 2
    Dernier message: 07/12/2005, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo