专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VC

调用socket中recvfrom监听网络端口的程序作为子线程怎样让主线程不卡住解决思路

发布时间:2011-06-23 14:23:51 文章来源:www.iduyao.cn 采编人员:星星草
调用socket中recvfrom监听网络端口的程序作为子线程怎样让主线程不卡住
具体:我写了一个用于监听本机端口从而接收发往本机的UDP报文,用到了socket中的recvfrom函数,但是,我想的是设置一个进程,主线程进行界面方面的操作,而让这个程序(socket接收报文)作为一个子线程的形式运行于后台,获得数据之后,将该数据传给这个主线程(设置全局变量),但是,当运行到recvfrom这个函数是,它是一个听的状态,导致子线程阻塞,从而让主线程也阻塞,界面就卡着像死机一样,但是当接收到UDP报文的时候,界面有恢复正常,高手帮我解决下啊,我想在子线程调用recvfrom函数监听端口的时候,主线程不至于卡机。谢谢哪位高手帮忙。

------解决方案--------------------
就是开辅线程而已了。比如:

Thread th=new Thread(new ThreadStart(YourMethod));//开辅线程
th.IsBackground=true;
th.Start();

public void YourMethod()
{
//接受数据的方法。
}

需要注意的,如果你在子线程(也就是辅线程里面,接受到数据后,需要修改主线程UI界面的显示的数据,那么你会得到“不是在创建控件的线程。。。。”异常。解决方法如下:
解决方法有两个~

第一:
Control.CheckForIllegalCrossThreadCalls = false;
线程开始的时候加这么一句,OK,看不到错误了~
啥都能用了~

第二:
用委托,在05里,每个控件都有个InvokeRequired的属性~
判断一下是不是true,是的话进行Invoke操作的,完事了~

//建立个委托
private delegate string returnStrDelegate();

//搞个最简单滴取值滴方法~
private string returnSchool()
{
return CB_School.SelectedValue.ToString();
}

//判断一下是不是该用Invoke滴~,不是就直接返回~
private string returnCB(returnStrDelegate myDelegate)
{
if (this.InvokeRequired)
{
return (string)this.Invoke(myDelegate);
}
else
{
return myDelegate();
}
}

//别的线程里的调用哇~
string _school = returnCB(returnSchool);
------解决方案--------------------
定,支持楼主!高手帮忙解答下啊!
------解决方案--------------------
没有必要开辅助线程了,如果你不会辅助线程的话。
设定个timer就可以,简单。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: