Bonjour à tous

Pour un programme que je développe, je dois jouer un son à une certaine fréquence jusqu'à ce que l'on clique sur le bouton Gauche de la souris.

La fonction BEEP permet de jouer un son de fréquence passé en paramètre ainsi qu'une durée.
Je ne peux donc pas l'utiliser en état car moi c'est un évènement souris qui arrête le son et non une durée.

J'ai donc créé un Thread dans lequel je lance le son avec une durée suffisamment grande pour ne pas que le son se coupe trop tôt.

Et donc quand mon évènement souris se déclenche, je termine le Thread pour arrêter le son.

Or le son ne s'arrête pas quand je clique sur la souris, il continu jusqu'à son terme avant d'effectuer ce qu'il y a dans la fonction de l'évènement souris.

Auriez-vous une solution à mon problème.

Voici mon code simplifié

ThreadSon.h
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
 
//---------------------------------------------------------------------------
 
#ifndef ThreadSonH
#define ThreadSonH
 
//---------------------------------------------------------------------------
 
#include <System.Classes.hpp>
 
//---------------------------------------------------------------------------
 
class TThreadSon : public TThread
{
	private:
 
		// Frequence
		int Frequence;
 
		// Duree
		int Duree;
 
	protected:
 
		void __fastcall Execute();
 
 
	public:
 
		__fastcall TThreadSon(bool CreateSuspended, int F, int D);
};
 
//---------------------------------------------------------------------------
 
#endif


ThreadSon.cpp
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
 
//---------------------------------------------------------------------------
 
#include <System.hpp>
#pragma hdrstop
 
#include "ThreadSon.h"
 
#include "Principale.h"
 
 
#pragma package(smart_init)
 
//---------------------------------------------------------------------------
 
//   Important : Les méthodes et les propriétés des objets de la VCL peuvent seulement être
//   utilisées dans une méthode appelée avec Synchronize, par exemple :
//
//      Synchronize(&UpdateCaption);
//
//   où UpdateCaption pourrait ressembler à :
//
//      void __fastcall TThreadSon::UpdateCaption()
//      {
//        Form1->Caption = "Mis à jour dans un thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall TThreadSon::TThreadSon(bool CreateSuspended, int F, int D)
	: TThread(CreateSuspended), Frequence(F), Duree(D)
{
	// on marque que le Thread se détruit tout seul
	FreeOnTerminate = true;
}
 
//---------------------------------------------------------------------------
 
void __fastcall TThreadSon::Execute()
{
	//---- Placer le code du thread ici ----
	// On joue le Son
	Beep(Frequence, Duree);
}
 
//---------------------------------------------------------------------------
Code Principal
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
 
// Voici comment je lance mon Son
ThreadSon = new TThreadSon(false, Frequence, 10000);
 
// Méthode déclenchée lorsqu'on appuie sur le bouton de la Souris
void __fastcall TAffichageForm::OnMouseDown(TObject *Sender, TMouseButton Button,
		  TShiftState Shift, float X, float Y)
{
	// Si le bouton Gauche est enfoncé
	if(Button == TMouseButton::mbLeft)
	{
		// Si le Thread son est en route
		if(ThreadSon)
		{
			// on termine le Thread
			ThreadSon->Terminate();
		}
	}
}
Merci d'avance pour votre aide