小弟最近学习 想做一个聊天的小程序当客户端A 和 客户端B 通讯的时候A 接受到 B 的消息A在事件处理中new 一个Form FormMsg 并Show()然后 调用 FormMsg 的方法(显示消息)
程序运行后,可以看到在B发出消息后,A弹出了Form,并且Form上也显示了数据,但是显示完数据后,Form就无法响应了因为A和B接受发送数据都是多线程的 我想这可能和多线程与Form有关吧 网上看了几篇都不是很懂 请大侠们指教!
A 中处理接受消息的事件:(大意如此)private void StringInputHandler(String Data)
{
FormMSG newForm = new FormMSG();
newForm.Show();
newForm.ShowText(Data);
}小弟先谢谢大家了!!
程序运行后,可以看到在B发出消息后,A弹出了Form,并且Form上也显示了数据,但是显示完数据后,Form就无法响应了因为A和B接受发送数据都是多线程的 我想这可能和多线程与Form有关吧 网上看了几篇都不是很懂 请大侠们指教!
A 中处理接受消息的事件:(大意如此)private void StringInputHandler(String Data)
{
FormMSG newForm = new FormMSG();
newForm.Show();
newForm.ShowText(Data);
}小弟先谢谢大家了!!
由这个client socket和你的server进行通讯,然后在client socket中把
接受到的东西往你的form上显示
gambolgs(Gambol)
Bote_China() 两位说的对 但是我不太清楚怎么改我试着改为(大意如此,我用的ParameterizedThreadStart传参数)private void StringInputHandler(String Data)
{
Thread th = new Thread()
th.start
}void NewForm()
{
FormMSG newForm = new FormMSG();
newForm.Show();
newForm.ShowText(Data);
}但是这个newForm一显示 瞬间又关闭了 怎样给这个Form一个独立的线程又能接受到父窗体的消息和调用呢??
父窗体接收到连接请求后,
就创建一个子窗体,同时生成一个通讯子线程,
把这个通讯子线程通过窗口的构造函数传过去,
接下去有这个通讯子线程和server进行通讯。
子线程收到数据后,通过委托方式让数据显示在子窗体中
如果理解FTP的处理方式,你就会知道应该用什么方式去做。
http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-sharp-Part-II/1/
文章中好像只是讲Socket的异步传输数据 但没有Form的问题啊我这里用的codeproject上有个人写的一个类 XYNetSocket.XYNetServer server
这个XYNetServer 是多线程的在父窗体中 server.StartServer() 后 如果有消息传来 就会响应StringInputHandler
我是想新建一个子窗体 并显示数据在上面 但是现在子窗体显示数据后 就无法响应了 就是鼠标点击没有 窗体也补重画了 private void StringInputHandler(String Data)
{
FormMSG newForm = new FormMSG();
newForm.Show();
newForm.ShowText(Data);
}这多线程和WinForm我比较糊涂了 请大家指教啊!!
//用委托调用显示窗体的方法
ShowMessage showMsg = new ShowMessage(StringInputHandler);
Object[] obj = {Data};//Data是传入方法的参数
this.Invoke(showMsg,obj);
{
FormMSG newForm = new FormMSG();
newForm.Show();
newForm.ShowText(Data);
}这段代码用你所说使用委托怎么修改呢??要改 Show() 和 ShowText()吗?谢谢阿
{
newForm.Invoke(new ShowHandler(newForm.Show));
newForm.Invoke(new AppendTextHandler(newForm.AppendText), new object[] { temp.Name, ss[1], false });
}如果这样子 直接看不到窗体了 但是能接受到数据
在窗体加上我定义的委托,再在你要调用StringInputHandler方法的地方改为我下面那几行代码就行了..
“再在你要调用StringInputHandler方法的地方”StringInputHandler 是处理事件的方法啊private void StringInputHandler(String sRemoteAddress, int nRemotePort, String sData)我只是把它加上而已啊 ??
if (newForm.InvokeRequired) 一直是false
但是newForm.Show() 就又会没响应
FormMSG newForm = new FormMSG();
newForm.Show();
newForm.ShowText(Data);
代码放在fun方法里面
然后在StringInputHandler方法里面将原来代码注释,加上
ShowMessage showMsg = new ShowMessage(fun);
Object[] obj = {Data};
this.Invoke(showMsg,obj);
再试试看