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

C Discussion :

Créer une temporisation plus fine sous linux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut Créer une temporisation plus fine sous linux
    Bonjour,

    J'ai fait un équivalent à la fonction "sleep" portable sous Windows et Linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void attendre(int ms) {
        #ifdef WIN32
        Sleep(ms);
        #elif defined (linux)
        int sec = (ms / 1000);
        if(sec == 0)
            sec = 1;
        sleep(sec);
        #endif
    }
    Je suis au courant que Sleep de Windows n'est pas précis à la milliseconde près, mais je recherche une fonction qui ai une précision de 100ms environ et c'est le cas pour Sleep.

    Le soucis, c'est que la précision de sleep sous Linux ne dépasse pas la seconde... je voudrais donc améliorer ma fonction pour avoir une précision à peu près égale sous Windows et Linux.

    Des idées ? Merci.

  2. #2
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut,

    Tu peux faire un sleep a la micro/milliseconde en utilisant select() ou poll():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <sys/select.h>
    struct timeval temps;
    temps.tv_sec=temps_en_seconde;
    temps.tv.usec=temps_en_microseconde;
    select(0, NULL, NULL, NULL, &temps);
     
    #include <poll.h>
    struct pollfd aa;
    int temps;
    temps=temps_en_milliseconde;
    poll(&aa, 0, temps);

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par FabaCoeur Voir le message
    J'ai fait un équivalent à la fonction "sleep" portable sous Windows et Linux:
    ceci devrait t'aider !

    http://delahaye.emmanuel.free.fr/clib/psleep/

  4. #4
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Ah oui pourquoi faire simple ?
    Comme je suis en train de me prendre la tete avec un select j'avais carrement oublie usleep

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Il me semblait bien que ce problème avait FORCEMENT déjà été résolu ^^
    Pas contre je n'ai pas trop compris dans le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define msleep(ms) usleep((ms) * 1000)
    Si on multiplie ms par 1000, on se retrouve en seconde alors qu'on est en milliseconde sous Windows avec Sleep...!
    Une explication ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par FabaCoeur Voir le message
    Une explication ?
    usleep() compte en microsecondes et pas en millisecondes. Le u est censé être un µ, en fait :-) Une certaine anecdote sur le Wikipédia français, d'ailleurs ...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Tout s'explique

    En fait je pensais être limité à 1s de précision sous Linux à la base et voila que je me retrouver un million de fois plus précis (même mille fois plus précis que sous Windows maintenant)

    Aux imprécisions près...

    Sympas l'anecdote

    Merci !


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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/10/2006, 13h55
  2. Formater une cassette de sauvegarde sous LINUX
    Par dragonfly dans le forum Administration système
    Réponses: 10
    Dernier message: 22/03/2006, 11h02
  3. Creer une base de donnée sous linux
    Par nissarte dans le forum Installation
    Réponses: 2
    Dernier message: 01/03/2006, 14h56
  4. Créer une barre de progression sous Vba ??
    Par Deejoh dans le forum Général VBA
    Réponses: 7
    Dernier message: 17/10/2005, 15h05
  5. Attaquer une base Oracle installée sous linux
    Par lessoy dans le forum Oracle
    Réponses: 1
    Dernier message: 13/10/2005, 13h54

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