这一次的作业主要考察点在于进程间通信。一个进程建立后,先查看是否已经有该进程的实例正在运行。如果有,则传递消息让已有进程创建新标签页。如果没有,就自己创建一个。
进程间通信我采用了命名管道技术。一个程序先检查这个命名管道是否已经打开。如果打开,就尝试连接,并将参数传过去。如果没有打开,就自己创建一个,等待外部连接。
接收端:
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);
这样,这个程序中的难点就没有了。
以下是运行图片: