私がやろうとしているのは、音楽ファイルを指定された時間だけ再生してから、再生を停止することです。ただし、音楽ファイル全体が再生されています。何か案は?
新しいスレッドを開始しようとしましたが、まだ機能しません。
私がやろうとしているのは、音楽ファイルを指定された時間だけ再生してから、再生を停止することです。ただし、音楽ファイル全体が再生されています。何か案は?
新しいスレッドを開始しようとしましたが、まだ機能しません。
私はほぼ次のようなものを作成します。編集ウィンドウで手に負えないように書かれているだけなので、そのようにコンパイルされるとは思わないでください。アイデアを説明することだけを目的としています。
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();
}
}
}
問題は、PlaySyncがスレッドをブロックするため、他のメッセージが処理されないことです。これには、Tickイベントからの停止コマンドが含まれます。通常のPlay関数を使用する必要があります。これは非同期で、ファイルを再生するための新しいスレッドを作成します。アプリケーションの動作に応じて、結果として生じるマルチスレッドの状況を処理する必要があります。
これを試して:
ThreadPool.QueueUserWorkItem(o => {
note.Play();
Thread.Sleep(1000);
note.Stop();
});