zoukankan      html  css  js  c++  java
  • homework-03

    这一次的作业主要考察点在于进程间通信。一个进程建立后,先查看是否已经有该进程的实例正在运行。如果有,则传递消息让已有进程创建新标签页。如果没有,就自己创建一个。

    进程间通信我采用了命名管道技术。一个程序先检查这个命名管道是否已经打开。如果打开,就尝试连接,并将参数传过去。如果没有打开,就自己创建一个,等待外部连接。

    接收端:

    public void receiver()
            {
                while (Form1.frm == null) ;
                while (Form1.frm.loaded == false) ;
                while (true)
                {
                    string str=null;
                    NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.In);
                    pipeServer.WaitForConnection();
                    StreamReader sr = new StreamReader(pipeServer);
                    str = sr.ReadLine();
                    str = str.Trim();
                    sr.Close();
                    pipeServer.Close();
                    
                    if (str != null)
                    {
                        str = str.Trim();
                        Form1.frm.BeginInvoke(new System.EventHandler(Form1.frm.newtab), str);
                    }
                }
            }

    发送端:

    void sendmsg(string str)
            {
                NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.Out);
                pipeClient.Connect();
                StreamWriter sw = new StreamWriter(pipeClient);
                sw.WriteLine(Launcher.inittab);
                sw.Flush();
                sw.Close();
    
            }

    其中接收端是一个专门监听通信的线程。跨线程调用试用了C#的委托。

    使用委托时,必须先包装所需要调用的

    函数:

    public void newtab(object o, System.EventArgs e)
            {
                Launcher.inittab = o.ToString().Trim();
                int len = tabs.TabPages.Count;
                string[] tstr = Launcher.inittab.Split('\');
                string str = tstr[tstr.Length - 1];
                tabs.TabPages.Add(str);
                Canvas tc = new Canvas();
                tc.tp = this.tabs.TabPages[len];
                tabs.TabPages[len].Controls.Add(tc);
            }

    然后在当前进程中任意一个线程中,就可以以如下方式调用了:

    Form1.frm.BeginInvoke(new System.EventHandler(Form1.frm.newtab), str);

    这样,这个程序中的难点就没有了。

    以下是运行图片:

  • 相关阅读:
    深入理解计算机系统读书笔记之第二章信息的表示和处理
    深入理解计算机系统读书笔记之第一章:漫游
    算法三之归并排序
    算法二之子集和数问题
    算法一之N皇后问题
    刚刚注册写一写
    linux alias(命令别名)
    linux [CTRL]+c与[CTRL]+d
    linux终端类型
    linux 进程简介
  • 原文地址:https://www.cnblogs.com/yzong/p/3379425.html
Copyright © 2011-2022 走看看