2010-03-28 173 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