代码之家  ›  专栏  ›  技术社区  ›  user472875

C在类之间传递消息

  •  2
  • user472875  · 技术社区  · 14 年前

    我对C和多线程编程有点陌生,但下面是:

    我正在一个系统上工作,在这个系统中,我将拥有一个类,该类将被实例化,然后等待来自另一个正在运行的类的各种消息。我该如何去捕捉和发送这些信息呢?

    谢谢,

    颗粒物

    4 回复  |  直到 14 年前
        2
  •  3
  •   TalentTuner    14 年前

    如果不使用.NET远程处理在不同的AppDomain之间发送对象。

    在简单场景中:

    1-创建主类的singleton对象。

    2-使用事件和委托在类之间发送消息。

    如果需要在AppDomain之间发送消息。

    1-如果AppDomain不跨计算机边界,则使用IPC通道(.NET 2.0及更高版本)

    2-如果AppDomain超过了计算机边界,则可以使用.NET远程处理。

        3
  •  2
  •   James Dunne    14 年前

    使用生产者/消费者队列。在.NET 4.0中有一个默认实现,在网络上有许多示例实现。根据您的描述,您需要的是一个生产者/消费者队列。

    通常情况下,一个线程被视为生产者,并将消息写入队列。另一个线程(称为使用者线程)正在空闲等待消息出现在队列中。关于这些线程如何相互合作(或不合作)的同步细节取决于实现。

        4
  •  2
  •   Ed Power    14 年前

    如果您使用的是.NET 3.5,请在单独的线程中运行发送者,并从侦听器传递回调方法:

    class Program
        {
            static void Main(string[] args)
            {
                Listener listener = new Listener();
                Sender sender = new Sender();
                sender.Send = new TalkDelegate(listener.TalkToMe);
                Thread thread = new Thread(sender.Run);
                thread.IsBackground = true;
                thread.Start();
                listener.Listen();
            }
        }
    
        delegate bool TalkDelegate(string messageArg);
    
        class Listener
        {
            bool keepListening = true;
    
            public bool TalkToMe(string messageArg)
            {
                Console.WriteLine(messageArg);
                return keepListening;
            }
    
            public void Listen()
            {
                DateTime startTime = DateTime.Now;
                while ((DateTime.Now - startTime) < TimeSpan.FromSeconds(10))
                {
                    Thread.Sleep(100);
                }
                keepListening = false;
            }
        }
    
        class Sender
        {
            public TalkDelegate Send;
    
            public void Run()
            {
                bool keepTalking = true;
                while (keepTalking)
                {
                    keepTalking = Send(DateTime.Now.ToString("HH:mm:ss"));
                    Thread.Sleep(1000);
                }
            }
        }