• 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);

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

    以下是运行图片:

  • 相关阅读:
    3.29Java流程控制语句之循环结构
    3.27Java自动类型转化
    3.27Java流程控制语句
    3.27字符串连接符
    计算机系统概论
    《算法导论》第12章 二叉查找树 (2)查找、插入与删除
    《算法导论》第14章 数据结构的扩张 (1)动态顺序统计
    《算法导论》第12章 二叉查找树 (3)基数树
    关于算法学习的总结和感悟(原创)
    《Windows游戏编程大师技巧》二、Windows编程模型
  • 原文地址:https://www.cnblogs.com/yzong/p/3379425.html
Copyright © 2020-2023  润新知