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 :

Action limit� dans le temps


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par d�faut Action limit� dans le temps
    Bonjour,

    Je souhaiterais limit� dans le temps l'action d'une m�thode d'une classe.
    J'ai pens� au thread et au timer mais mon esprit est encore confus.

    Voici l'id�e tr�s simple (en soit) de mon projet :

    je lis un son � l'aide de la librairie SndObj

    J'ai un fichier texte � c�t� dans lequel j'indique qu'� la 5�me seconde on entend un homme parler.

    son.txt :

    Je souhaite lire mon fichier texte et afficher � la 5�me seconde de la lecture du fichier son le texte correspondant. Un peu comme des sous-titre.

    L'id�e final est en r�alit� de manipuler une image et de modifier son aspect de fa�on s�quentiel en fonction d'un son. Comme si je cr�e une ligne de temps et que je venais placer des �v�nements se d�clenchant � un temps t1 donn� par le fichier son et qui s'arr�te � un temps t2 donn�e aussi par le fichier son. La ligne s�quentielle �tant donn�e par le fichier texte.

    Mes effet suivent une structure du style :

    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
     
     
    class Effect{
     
    protected:
    		int      m_startTime;
    		int      m_stopTime;
    		int      m_duree;
    		char     m_activity;
     
    public:
     
    //Destructor
    		virtual ~Effect();
     
    	void start(void);
            void stop(void);
     
            virtual void update(void) = 0;
    };
    ainsi dans le corps du programme je souhaiterais appeler mon effet � l'aide de start() et qu'il s'arr�te lorsque la valeur stopTime est atteinte.

    J'ai voulu utiliser des timer que j'associe � mes objets... mais cette solution ne semble pas id�ale et surtout ne fonctionne pas :
    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
     
    void Effect::start(void)
    {
        struct itimerval timerEffect;
    	int duree = m_duree; //en secondes
    	int u_duree = 0; //en milliseconde
    	timerEffect.it_interval.tv_sec = 0;
    	timerEffect.it_interval.tv_usec = 0;
    	timerEffect.it_value.tv_sec = duree; /* set timer for variable duree in seconds */
    	timerEffect.it_value.tv_usec = u_duree; /* set timer for variable u_duree in milliseconds */
    	setitimer(ITIMER_REAL, &tout_val,0);
     
    	signal(SIGALRM,stop); /* set the Alarm signal capture */
     
        m_activity = 1;
    }
     
    void Effect::stop(void)
    {
            m_activity = 0;
    	cout<<"Timer finished : fin"<<endl;
    	signal(SIGALRM,stop);
    }

    �a ne passe pas la compilation et je m'en doutais bien car la fonction associ� au timer doit �tre une fonction et non une m�thode....

    Je ne vois donc pas comment faire.

    Une id�e ??

    Merci d'avance !


    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par d�faut
    J'ai rencontr� ce probl�me quand j'ai voulu utiliser OpenGL. Tu ne peux pas passer une m�thode d'objet, qui requiert un type de pointeur sp�cifique, mais tu peux par contre passer une m�thode de classe (d�clar�e avec static) ; si tu peux trouver un moyen d'appeler la m�thode n�cessaire sur l'objet dont tu as besoin en passant par cette m�thode static, �a ira. Tu auras peut-�tre besoin de recourrir � d'autres ruses, utiliser un pattern comme le singleton, par exemple.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Citation Envoy� par SpongeBob Voir le message

    �a ne passe pas la compilation et je m'en doutais bien car la fonction associ� au timer doit �tre une fonction et non une m�thode....
    Tu peux pr�ciser le prototype?
    (peut etre tu peux t'en sortir avec boost::bind)

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par d�faut
    Comme je l'ai compris :

    l'appel de signal system n�cessite l'utilisation de fonctions global ou statique et non une fonction membre C++ comme celle-ci ( stop() ).

    Comme je souhaite faire des actions sp�cifique suivant les objets, cette m�thode de l'utilisation du timer n'est pas viable.

    Donc Bind je vois pas trop ce que �a vient faire ici.

    Pouvons-nous approfondir cette id�e ?


    Noxen qu'elle est plus pr�cis�ment ton id�e ?

    Merci � vous

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Je pensais � :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    signal(SIGALRM, boost::bind(&Effect::stop, *this) )
    bind est fait pour �a, non ?

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par d�faut
    L'initialisation de glut et opengl n�cessite de lui passer des pointeurs vers des fonctions. Par exemple, il y a besoin d'une fonction d'affichage pour que la biblioth�que sache ce qu'elle doit afficher :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void paintApp(){ .... } // fonction d'affichage de l'application
     
    int main(){
    .....
        glutDisplayFunc(paintApp); // glut a besoin qu'on lui passe une fonction void func (void)
    ...
    }
    A la place on peut lui passer une m�thode de classe, static:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class LibraryInterface{
    public:
        static void paint() { .... }
    ......
    };
     
    int main(){
        glutDisplayFunc(LibraryInterface::paint);
    ....
    }
    Sauf que tu peux m�moriser des informations dans ta classe via des variables static (entre autre). Donc dans ton cas :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class LibraryInterface{
    private:
        static Effect* currentEffect;
    ...
    public:
        void setEffect(Effect* ef) {currentEffect = ef;}
     
        void stopEffect() { if(currentEffect) currentEffect->stop(); }
     
    .....
    };
    Et dans le code appellant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Effect::start(){
    ....
     
        LibraryInterface::setEffect(this);
        signal(SIGALRM, LibraryInterface::stopEffect);
    ...
    }
    Ceci-dit, je ne connais pas boost::bind, alors il est tr�s possible que ce soit une meilleure solution.

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Citation Envoy� par Noxen Voir le message
    Ceci-dit, je ne connais pas boost::bind, alors il est tr�s possible que ce soit une meilleure solution.
    Ben tu peux vraiment faire ce que tu veux avec boost::bind (et m�me std::tr1::bind maintenant ). C'est fait pour �a! Pas besoin de changer ton code...

  8. #8
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par d�faut
    Il va vraiment faloir que je m'accorde un peu de temps pour �tudier boost

  9. #9
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par d�faut
    Je suis pas certain que l'utilisation d'un signal soit le plus pertinent dans le cas que tu d�cris (mais je suis pas un unixien de base, et l'utilisation des signaux n'est pas ma sp�cialit�).

    Tu pourrais stoker l'ensemble de tes �v�nements (les objets Effect) dans un container et traiter cette liste soit avec une boucle suivit �ventuellement d'un Sleep ou d'une synchro vid�o (cas classique des programme d'animation 2D ou 3D), soit utiliser un thread d�di� aux effets et qui attendrait sagement � l'aide d'un sleep le moment du prochain �v�nement.

    Si tu veux tout de m�me utilis� un signal, il suffit que tu le programme pour appeler une fonction traitant le conteneur d'effets.

    L'utilisation d'une thread+sleep est proche de l'utilisation du signal, dans les deux cas, il faut que tu programme la dur� a attendre en fonction du prochain effet � jouer.

    Par contre, dans le cas de la boucle d'affichage, il te suffit de v�rifier � chaque tour de boucle si l'effet en t�te du conteneur doit �tre jouer 'maintenant'.

    Dans tous les cas, peux �tre dict� par la pr�cision temporelle que tu cherches � atteindre (en dessous de qlq 10aine de ms, �a devient tr�s difficile)

Discussions similaires

  1. R�ponses: 19
    Dernier message: 22/11/2008, 13h50
  2. Limiter dans le temps un t�l�chargement
    Par MANU_2 dans le forum G�n�ral Conception Web
    R�ponses: 13
    Dernier message: 23/01/2008, 18h31
  3. Limiter dans le temps mon code Java
    Par GLDavid dans le forum Langage
    R�ponses: 3
    Dernier message: 17/04/2007, 09h22
  4. [Licence]Programme limité dans le temps
    Par tof.p dans le forum G�n�ral Java
    R�ponses: 2
    Dernier message: 28/10/2005, 14h09
  5. R�ponses: 5
    Dernier message: 06/05/2005, 19h10

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