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

  1. #1
    Membre régulier
    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
    Points : 113
    Points
    113
    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,
    Développeur d'Ultracopier

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    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 régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Voila un exemple simple pour un cas minimal de teste:
    http://files.first-world.info/temp/main.cpp
    Développeur d'Ultracopier

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    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 régulier
    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
    Points : 113
    Points
    113
    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.
    Développeur d'Ultracopier

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    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.

  7. #7
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Désolé, j'ai retrouver dans le spam la notification.
    Ca marche mieux pour le toc de départ. Par contre, j'ai surtout besoin des toc à intervalle fix dés le lancement. Pouvoir config avoir un toc toutes les X ms, pour faire des truc à intervalle régulié.
    Développeur d'Ultracopier

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    C'est quoi les toc ?
    Et puis, d'après ce que j'ai vu, le timer était régulier
    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.

  9. #9
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    C'est quoi les toc ?
    Le event d'orloge.
    Citation Envoyé par LittleWhite Voir le message
    Et puis, d'après ce que j'ai vu, le timer était régulier
    Pas içi, içi j'ai l'event qu'une fois. Aprés, plus rien.
    Développeur d'Ultracopier

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Oui, en effet. Cela est du à votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = epoll_wait (efd, events, MAXEVENTS, -1);
    qui ne reçoit aucun nouveau événément. Le timer n'est absolument pas bloqué et on peut le vérifier avec un read (et en enlevant le flag non block). Donc le timer est ok.
    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.

  11. #11
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    qui ne reçoit aucun nouveau événément
    Donc ça doit étre cette partie que je n'est pas compris. Comment faire pour recevoir ces événéments à intervale régulié?
    Développeur d'Ultracopier

  12. #12
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Je m'en sort pas, j'aimerai savoir ce que je doit changer pour aller voir dans la doc à quoi ça corresponds.
    Développeur d'Ultracopier

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