2013-07-01 3 views
0

J'ai une application qui utilise une minuterie à 1 en 1 minute effectuer des données d'actualisation dans un DataGridView. Selon les informations à retourner à l'écran, un son différent sera joué. Chaque son a une durée de lecture. J'utilise cette commande pour avoir l'effet de la durée de ma musique.Thread.Sleep ne fonctionne pas comme prévu dans Windows Forms C#

Thread.sleep(GetMusicDuration[i] * 1000); 

Quand je commence ma demande la première fois, tout va bien, mais quand le temps ne se TICK événement qui transporte les informations contenues dans le DataGridView à nouveau et exécuter PLAY pour lire les sons ma commande Thread.Sleep ne fonctionne pas , il ignore simplement ne pas attendre l'heure définie pour le paramètre.

public void PlaySound() 
    { 
     try 
     { 
      while (1 == 1) 
      { 
       List<string> distinctMusic = GetMusicFile.Distinct().ToList(); 
       StopSound(); 
       if (distinctMusic.Count > 0) 
       { 
        for (int i = 0; i < distinctMusic.Count; i++) 
        { 
         player.SoundLocation = distinctMusic[i]; 
         player.Play(); 
         Thread.Sleep(GetMusicDuration[i] * 1000); 
         StopSound(); 
        } 
       } 

       DisposePlayer(); 
      } 
     } 
     catch (Exception e) 
     { 
      if (generateLog) 
       log.LogTxt(e.ToString()); 
     } 
    } 

Jusqu'à maintenant je ne comprenais pas pourquoi l'exucução mal.

quelqu'un pourrait m'aider?

merci ...!

+1

Qu'essayez-vous de faire? Je garantis la Thread.Sleep est la mauvaise approche ** Edit ** Je viens de relire la question et peut-être essayer d'utiliser une minuterie – Sayse

+0

Je joue une chanson avec la classe SoundPlayer, et je cours Thread.Sleep comme temps de jeu, puis exécutez le SoundPlayer.Stop(); – user1792343

+0

Etes-vous sûr de vouloir disposer de votre lecteur * dans votre boucle while? –

Répondre

0

Thread.Sleep bloque le fil d'interface utilisateur. Vous devez utiliser une minuterie à la place:

//Create a new timer that ticks every xms 
var t = new System.Timers.Timer (GetMusicDuration[i] * 1000); 

//When a tick is elapsed 
t.Elapsed+=(object sender, System.Timers.ElapsedEventArgs e) => 
{ 
    //what ever you want to do 
}; 
//Start the timer 
t.Start(); 
Questions connexes