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 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
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); } //---------------------------------------------------------------------------
Merci d'avance pour votre aide
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(); } } }
Partager