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

Linux Discussion :

Epoll et timer


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut Epoll et timer
    Bonjour,

    J'essaye de faire un timer non bloquant sous linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include "Timer.h"
    #include "Epoll.h"
     
    #include <time.h>
    #include <sys/timerfd.h>
    #include <stdio.h>
     
    Timer::Timer()
    {
    }
     
    BaseClassSwitch::Type Timer::getType()
    {
        return BaseClassSwitch::Type::Timer;
    }
     
    bool Timer::init()
    {
        if((tfd=::timerfd_create(CLOCK_MONOTONIC,TFD_NONBLOCK)) < 0)
        {
            perror("timerfd create error");
            return false;
        }
     
        timespec now;
        if (clock_gettime(CLOCK_REALTIME, &now) == -1)
        {
            perror("clock_gettime");
            return false;
        }
        itimerspec new_value;
        new_value.it_value.tv_sec = now.tv_sec + 2;
        new_value.it_value.tv_nsec = now.tv_nsec;
        new_value.it_interval.tv_sec = 1;
        new_value.it_interval.tv_nsec = 0;
     
     
        int result=::timerfd_settime(tfd, TFD_TIMER_ABSTIME, &new_value, NULL);
        if(result<0)
        {
            perror("settime error");
            return false;
        }
        epoll_event event;
        event.data.ptr = this;
        event.events = EPOLLIN | EPOLLET | EPOLLONESHOT | EPOLLWAKEUP | EPOLLMSG;
        if(Epoll::epoll.ctl(EPOLL_CTL_ADD,tfd,&event) < 0)
        {
            perror("epoll_ctl error");
            return false;
        }
        return true;
    }
    Hors je ne recois aucun event d'aucune sorte.
    Si l'ont peu m'aider.

    Cordialement,

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    J'ai l'impression que le code n'est pas suffisant, pour comprendre le soucis, mais, bon, je pense aussi que c'est car je connais mal ce système.
    Un strace vous donnera peut être quelques idées sur le soucis

    Sinon, dans de tel cas, je fais un cas minimaliste, dans un main, pour vérifier le bon comportement du mécanisme (et surtout, valider sa mise en place).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut
    Voila un exemple simple pour un cas minimal de teste:
    http://files.first-world.info/temp/main.cpp

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Il ne trouvait pas le symbole 'EPOLLWAKEUP' chez moi.
    Sinon, d'après mon strace, le time ne fonctionne pas plus que ça.
    Pour le moment, je ne sais pas du tout. Est-ce que c'est le time qui n'agit pas, ou le epoll
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre éclairé
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut
    L'event loop et epoll marche très bien si j'ajoute à ce code un serveur et les sockets. Donc en toute logique, la partie epoll marche. Je pense que la merde viens des temps config pour le timer.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    C'est bien la configuration du timer. J'ai vérifié avec l'exemple du man de timerfd_create(), et eux, il utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((tfd=timerfd_create(CLOCK_REALTIME,0)) < 0)
    Et hop, ça marche mieux.
    Si je remet votre TFD_NONBLOCK ça marche encore, donc j'imagine que le gros gros soucis était l'utilisation de deux horloges différentes (peut être elle ne retourne pas du tout le même type de valeur, faisant que le temps à attendre était immensément trop long).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

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