using System; using System.Collections.Concurrent; using System.Threading; namespace StageController { public class MyMessage { private int m_msg; private object m_parm1; private object m_parm2; public int Msg { get { return m_msg; } set { m_msg = value; } } public object Parm1 { get { return m_parm1; } set { m_parm1 = value; } } public object Parm2 { get { return m_parm2; } set { m_parm2 = value; } } public MyMessage(int msg, object parm1, object parm2) { this.m_msg = msg; this.m_parm1 = parm1; this.m_parm2 = parm2; } } public class MsgMgr { private AutoResetEvent m_event = new AutoResetEvent(false); private ConcurrentQueue m_msg = new ConcurrentQueue(); private bool m_running = false; public Action MessageProcess { get; set; } public void EndLoop() { m_running = false; } public void SendMsg(int msg, object parm1, object parm2) { m_msg.Enqueue(new MyMessage(msg, parm1, parm2)); } public void MsgLoop() { m_running = true; while (m_running) { Thread.Sleep(50); MyMessage msg; if (m_msg.TryDequeue(out msg) && MessageProcess != null) { MessageProcess(msg.Msg, msg.Parm1, msg.Parm2); } } } } }