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.