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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 5 : homme qui parle
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 :
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.
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; };
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.
Partager