recv函数的问题,谢谢
我的程序难以实现的地方是:过了5秒,如果没有接收到网络中的数据,那么就不接收数据。//我设计了一个计时器:doubleCalTime(inttimeLen){double...
我的程序难以实现的地方是:
过了5秒,如果没有接收到网络中的数据,那么就不接收数据。
//我设计了一个计时器:
double CalTime(int timeLen)
{
double durtation = 0;
clock_t finish;
clock_t start = clock();
while(true) {
finish = clock();
durtation = (double)(finish-start)/1000;
if((double)timeLen <= durtation) {
break;
}
}
return durtation;
}
//////
因为,调用了recv函数,如果没有从网络中接收到数据,就一直等待,也就无法执行recv函数的下一行代码了;
如果用线程执行recv的话,那么,只能用TerminateThread关闭该线程了,然而,TerminateThread会引起程序出现异常现象(我试过了)!!!
所以,我还是有待于大家给出一个万全之策啊!!!
注:我的程序是---控制台应用程序+MFC库!!!不能进行消息相应!!! 展开
过了5秒,如果没有接收到网络中的数据,那么就不接收数据。
//我设计了一个计时器:
double CalTime(int timeLen)
{
double durtation = 0;
clock_t finish;
clock_t start = clock();
while(true) {
finish = clock();
durtation = (double)(finish-start)/1000;
if((double)timeLen <= durtation) {
break;
}
}
return durtation;
}
//////
因为,调用了recv函数,如果没有从网络中接收到数据,就一直等待,也就无法执行recv函数的下一行代码了;
如果用线程执行recv的话,那么,只能用TerminateThread关闭该线程了,然而,TerminateThread会引起程序出现异常现象(我试过了)!!!
所以,我还是有待于大家给出一个万全之策啊!!!
注:我的程序是---控制台应用程序+MFC库!!!不能进行消息相应!!! 展开
5个回答
展开全部
你的问题可能不再这几行代码中,TerminateThread关线程会让后续操作对象的代码无法执行,而这些对象可能会被其它线程调用,为初始化的对象指针肯定会引发错误。
为了避免这种错误,楼上的方法可以尝试,你可以用以辅助变量通知线程退出,让其自行退出,并做好善后工作。
另一个方法是把你其中要求跨线程引用地对象通过CriticalSection以及其它同步机制做好线程安全工作。但是,问题是CriticalSection在线程被TerminateThread时,状态是无法预知的,你要小心。
为了避免这种错误,楼上的方法可以尝试,你可以用以辅助变量通知线程退出,让其自行退出,并做好善后工作。
另一个方法是把你其中要求跨线程引用地对象通过CriticalSection以及其它同步机制做好线程安全工作。但是,问题是CriticalSection在线程被TerminateThread时,状态是无法预知的,你要小心。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以用
select
或者WSAEventSelect
函数来做
或者把其设置成非阻塞形式的。
就算都不用,用线程单独处理,只要方法得当也不会产生不良影响,比如在里面检测外部事件消息,检测socket错误并进行处理等。
select
或者WSAEventSelect
函数来做
或者把其设置成非阻塞形式的。
就算都不用,用线程单独处理,只要方法得当也不会产生不良影响,比如在里面检测外部事件消息,检测socket错误并进行处理等。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
向这个接收socket发送一个特定的数据, 如果接收到这个特定数据就退出循环。也可以吧while条件改成全局变量
bool g_bquit = false
main thread:
{
g_bquit=true;
send(s, "q",1, 0);
}
recv thread:
{
while(!g_bquit)
{
recv(...
}
}
bool g_bquit = false
main thread:
{
g_bquit=true;
send(s, "q",1, 0);
}
recv thread:
{
while(!g_bquit)
{
recv(...
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
设置超时函数setsockopt
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以用
select
或者WSAEventSelect
函数来做
select
或者WSAEventSelect
函数来做
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询