2010-03-28 207 views
1

問候,我試圖播放一些音頻文件,而不阻止GUI。以下是代碼示例:C#線程隊列同步

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。這是不行的,我想要的是:等到線程停止運行,然後再開始一個新的線程,這樣樣本不會重疊。

+0

線程設計爲同時執行任務,其他的以後打一個聲音是不是併發執行。你有可能在獨立的線程上播放聲音,但不是_each_聲音。佩託伊是正確的。 – 2010-03-28 19:01:53

+0

也可以使用線程,以便在等待數據時主GUI線程不會凍結。這就是我想在這裏做的。 – iTEgg 2010-03-28 20:56:27

回答

3

爲什麼不只是創建一個「WorkItem」,並在那裏做所有事情?

+0

我是新來的。什麼是WorkItem? – iTEgg 2010-03-28 15:42:50

+0

ThreadPool.QueueUserWorkItem(新的WaitCallback(HitProc),fireResult)在那裏添加一個「WorkItem」 – Peter 2010-03-28 15:43:58

+0

啊你的意思是在一個(Proc)中完成整個事情。以及這可能,但我只是想知道如果一組線程可以訂購執行或不。 – iTEgg 2010-03-28 15:48:19

1

您不能保證線程池線程的執行順序。正如其他人所建議的那樣,使用單個線程按順序運行特效。將音頻過程添加到隊列中,運行單個線程,按順序將每個過程從隊列中拉出並調用它們。每當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; 
} 
+0

是的,我相信你理解我的情況正確。仍然對你的代碼感到迷茫。我明白了,但不是執行,因爲我是初學者。謝謝,並隨時擴大您的帖子,如果你喜歡。我非常歡迎它。 – iTEgg 2010-03-28 18:45:48