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

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

以下是运行图片:

posted on 2013-10-20 20:20  不想嚣张  阅读(185)  评论(0编辑  收藏  举报

导航