1

こんにちは、GUI を保持せずにいくつかのオーディオ ファイルを再生しようとしています。以下はコードのサンプルです。

if (audio)
{
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(CoordinateProc), fireResult))
    {

    }
    else
    {
        MessageBox.Show("false");
    }
}

if (audio)
{
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(FireProc), fireResult))
    {

    }
    else
    {
         MessageBox.Show("false");
    }
}

if (audio)
{
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(HitProc), fireResult))
    {

    }
    else
    {
        MessageBox.Show("false");
    }
}

状況は、サンプルが順番に再生されていないことです。サンプルが順番に次々と再生されるように、これを修正する必要があります。

どうすればこれを実装できますか?

ありがとうございました。

編集:ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);

すべてのサウンド クリップを FireAttackProc に配置しました。これが行われず、私が望むのは、スレッドが実行を停止するまで待ってから、新しいスレッドを開始して、サンプルが重複しないようにすることです。

4

3 に答える 3

3

1 つの「WorkItem」を作成して、そこですべてを実行してみませんか?

于 2010-03-28T15:41:46.030 に答える
1

スレッド プール スレッドの実行順序は保証できません。それよりも、他の人が示唆しているように、単一のスレッドを使用してprocsを順番に実行します。オーディオ プロシージャをキューに追加し、キューから各プロシージャを順番に取り出して呼び出す単一のスレッドを実行します。イベント待機ハンドルを使用して、proc がキューに追加されるたびにスレッドに通知します。

例 (これは Dispose パターンを完全に実装しているわけではありませんが、アイデアは得られます):

public class ConcurrentAudio : IDisposable
{
    public ConcurrentAudio()
    {
        _queue = new ConcurrentQueue<WaitCallback>();
        _waitHandle = new AutoResetEvent(false);
        _disposed = false;
        _thread = new Thread(RunAudioProcs);
        _thread.IsBackground = true;
        _thread.Name = "run-audio";
        _thread.Start(null); // pass whatever "state" you need
    }

    public void AddAudio(WaitCallback proc)
    {
        _queue.Enqueue(proc);
        _waitHandle.Set();
    }

    public void Dispose()
    {
        _disposed = true;
        _thread.Join(1000); // don't feel like waiting forever
        GC.SuppressFinalize(this);
    }

    private void RunAudioProcs(object state)
    {
        while (!_disposed)
        {
            try
            {
                WaitCallback proc = null;

                if (_queue.TryDequeue(out proc))
                    proc(state);
                else
                    _waitHandle.WaitOne();
            }
            catch (Exception x)
            {
                // Do something about the error...
                Trace.WriteLine(string.Format("Error: {0}", x.Message), "error");
            }
        }
    }

    private ConcurrentQueue<WaitCallback> _queue;
    private EventWaitHandle _waitHandle;
    private bool _disposed;
    private Thread _thread;
}
于 2010-03-28T18:31:16.157 に答える
0

BackgroundWorkerオプションを確認する必要があります。

于 2010-03-28T16:08:25.127 に答える