2011-12-16 11 views
2

私がやっていることは、指定された時間だけ音楽ファイルを再生してから再生を停止することです。ただし、音楽ファイル全体が再生されています。何か案は?指定時間内に音楽ファイルを再生する方法

私はまだ新しいスレッドを開始しようとしましたが、それでもまだ動作しません。

+0

あなたは、このために通常のC#を使用している、またはあなたもXNAフレームワークを使用していますか? –

答えて

0

問題は、PlaySyncがスレッドをブロックするため、他のメッセージは処理されないということです。これには、Tickイベントからのstopコマンドが含まれます。非同期であり、ファイルを再生する新しいスレッドを作成する通常のPlay関数を使用する必要があります。アプリケーションの動作に応じて、結果として生じるマルチスレッド状況を処理する必要があります。

+0

私はこれをやろうとしており、上記のコードを更新しました。まだ動作していないので、どうぞご覧ください。私はそれがスレッドの問題だと思っています。 –

+0

残りのプログラムは何をしていますか?タイマーをClockTickでStop()とDispose()してタイマーを繰り返し起動させないようにすることを除いて、コードはほとんどの場合動作します。終了時にプログラムが終了すると、ユーザ入力を待たないコンソールアプリケーションを持っているかのように、ファイルは決して再生されません。 –

0

私はこのようなものをほぼ作成します。編集ウィンドウに手書きで書かれているだけなので、そのようにコンパイルするとは思いません。それはそのアイデアを説明するためのものです。

internal class MusicPlayer 
{ 
    private const int duration = 1000; 
    private Queue<string> queue; 
    private SoundPlayer soundPlayer; 
    private Timer timer; 

    public MusicPlayer(params object[] filenames) 
    { 
     this.queue = new Queue<string>(); 
     foreach (var filenameObject in filenames) 
     { 
      var filename = filenameObject.ToString(); 
      if (File.Exists(filename)) 
      { 
       this.queue.Enqueue(filename); 
      } 
     } 

     this.soundPlayer = new SoundPlayer(); 
     this.timer = new Timer(); 
     timer.Elapsed += new System.Timers.ElapsedEventHandler(ClockTick); 
    } 

    public event EventHandler OnDonePlaying; 

    public void PlayAll() 
    { 
     this.PlayNext(); 
    } 

    private void PlayNext() 
    { 
     this.timer.Stop(); 
     var filename = this.queue.Dequeue(); 
     this.soundPlayer.SoundLocation = filename; 
     this.soundPlayer.Play(); 
     this.timer.Interval = duration; 
     this.timer.Start(); 
    } 

    private void ClockTick(object sender, EventArgs e) 
    { 
     if (queue.Count == 0) { 
      this.soundPlayer.Stop(); 
      this.timer.Stop(); 
      if (this.OnDonePlaying != null) 
      { 
       this.OnDonePlaying.Invoke(this, new EventArgs()); 
      } 
     } 
     else 
     { 
      this.PlayNext(); 
     } 
    } 
} 
+0

あなたの提案をありがとう - 私は現在スレッドを使用しようとしています。編集したコードを見てみてください。 –

0

これを試してみてください。

ThreadPool.QueueUserWorkItem(o => { 
            note.Play(); 
            Thread.Sleep(1000); 
            note.Stop(); 
            }); 
関連する問題