J'ai un programme qui lit trois fichiers .wav de manière synchrone lorsqu'un bouton est cliqué. Le problème est que même si je désactive le bouton sur la première instruction du gestionnaire de clic, des événements de clic de souris supplémentaires sont mis en file d'attente et exécutés lorsque la lecture se termine si l'utilisateur clique pendant que le son est en cours de lecture. Comment puis-je éviter ça?C# Message file d'attente pendant que .wav est en cours de lecture
Voici mon gestionnaire de clic, playSnippet_P1,2,3 jouer les trois fichiers audio dans des ordres différents:
void btnPlay_Click(object sender, EventArgs e)
{
btnPlay.Enabled = false;
this.Refresh();
//play a snippet for the current passage
switch (myProgram.condition)
{
case 1:
playSnippet_P1();
break;
case 2:
playSnippet_P2();
break;
case 3:
playSnippet_P3();
break;
default:
if (myProgram.debug)
{
MessageBox.Show("Error(frmPassage): Invalid condition set: " + myProgram.condition);
}
break;
}
//leave this phase once final passage is finished
if (snipsPlayed >= (myProgram.snipCount_1
+ myProgram.snipCount_2
+ myProgram.snipCount_3))
{
myProgram.phaseController.runNextPhase();
}
//reset the form to show text for next passage
if (snipsPlayed >= (getSnipCount(1) + getSnipCount(2)))
currentPassage = 2;
else if (snipsPlayed >= getSnipCount(1))
currentPassage = 1;
else
currentPassage = 0;
lblTitle.Text = "Passage " + randPOrder[currentPassage].ToString();
btnPlay.Enabled = true;
}
private void playSnippet_P1()
{
snipsPlayed++;
int cSnipCount = getCSnipCount();
int snipNum = (snipsPlayed % cSnipCount);
int subNum = getSubNum(snipsPlayed);
if (snipNum == 0)
snipNum = cSnipCount;
int rPassage = randPOrder[currentPassage];
//play "Next question is for..."
JE_SP.playSound(Application.StartupPath
+ "\\res\\audio\\next\\Next" + subNum.ToString()
+ ".wav", true);
//play snippet
JE_SP.playSound(Application.StartupPath
+ "\\res\\audio\\passages\\Snip" + rPassage.ToString()
+ "-" + snipNum.ToString()
+ ".wav", true);
//play question
JE_SP.playSound(Application.StartupPath
+ "\\res\\audio\\passages\\Q" + rPassage.ToString()
+ "-" + snipNum.ToString()
+ ".wav", true);
string[] writeMe =
{
rPassage.ToString(),
"\\res\\audio\\passages\\Snip" + rPassage.ToString()
+ "-" + snipNum.ToString(),
"\\res\\audio\\passages\\Q" + rPassage.ToString()
+ "-" + snipNum.ToString(),
subNum.ToString(),
myProgram.condition.ToString()
};
JE_Log.logData(writeMe, "\t", myProgram.groupFile);
}
Vous allez devoir exécuter le code qui joue l'audio sur un autre thread, car l'interface utilisateur va être complètement ne répond pas dans le gestionnaire de clic, mise en file d'attente des événements à distribuer lorsque le contrôle revient à la boucle principale Winforms. – cdhowie
pouvez-vous afficher le code qui lit un extrait? – BrokenGlass
Vous voulez éviter cela - mais vous n'avez pas dit ce que vous voulez ... –