***网络通讯耗时等待问题***(分不在高,重在交流)!(300分)

  • 主题发起人 主题发起人 ChinaYA
  • 开始时间 开始时间
C

ChinaYA

Unregistered / Unconfirmed
GUEST, unregistred user!
网络通讯中自定义通讯处理规则中超时处理问题.通讯有线程执行.
有返回等待超时时间,如果超时,为了通讯的继续,杀死线程,重新创建(存在资源
损耗---很严重!).如何处理?
 
怎么?
没人感兴趣?
很有挑战性的!
 
为什么要杀掉?监听线程里面可以包括超时判断的代码。
 
事实上,在设计通讯服务线程的时候必须要考虑到效率和系统资源占用率的比例.

iie已经指出 + 该thread可以被suspend起来,如果suspent thread数量过多是
非常耗费系统的资源的,但是服务效率是很高(一定程度上)
 
感谢,两位.
to :iie socket 的 Recvfrom() 的 超时设置代码如何编写能?
to :jamstina : 如果SUSPEND起来,单我再次REMUME时,它不是还要继续等待吗?
我还是不能执行EXECUTE中发出数据的代码。( EXECUTE:
BEGIN
SOCKET_SEND.SENDTO();
WHILE SOCKET_WAIT.RECVFROM()<=0 DO ;
END;)


 
waitsingleobject
 
to : iie
使我没有说明白:
我的程序理有一个类
他本身是一个线程,主要功能就是收发数据,如果发出数据后没有受到返回码(自定协议)
则对此对象的此次发送作失败处理,杀死之,并新建;
如果收到正确的返回码,则给调用此对象的主进程的 waitforsingleobjcet();
发送消息(Myevent.setevent).
 
数据发送出去以后用WAITUNTILREADY判断是否有信息反馈过来,如果超过时间没有就作为超时处理!
超时以后不一定要将线程杀死,应该判别一下是否还有足够的后备线程,如果没有则将线程暂停,
如果已经有足够的后备线程了那么就杀死线程!由于线程内通常使用一个WHILE DO循环来读取、发送
数据,那么你可以在WHILE DO循环的开始作一个判断即是否是因为超时而跳至循环开始的!如果是则
暂停线程!否则继续执行!当发现超时的时候可以通过Continue;跳转到循环的开始!这样只要在循
环唤醒前将标志超时的变量赋值为FALSE,唤醒线程就可以正常发送接收数据了!
下面的函数是从ICS的SMTPPORT.PAS里COPY过来的!如果有不明白的地方可以自己去看全部的源程序!
function TsyncsmtpCli.WaitUntilReady : Boolean;
begin
Result := TRUE; { Suppose success }
FTimeStop := Integer(GetTickCount) + FTimeout * 1000;
while TRUE do begin
if FState = sReady then begin
{ Back to ready state, the command is finiched }
Result := (FRequestResult = 0);
break;
end;

if Application.Terminated or
((FTimeout > 0) and (Integer(GetTickCount) > FTimeStop)) then begin
{ Application is terminated or timeout occured }
inherited Abort;
FErrorMessage := '426 Timeout';
FStatusCode := 426;
Result := FALSE; { Command failed }
break;
end;
{$IFNDEF VER80}
if FMultiThreaded then
FWSocket.ProcessMessages
else
{$ENDIF}
Application.ProcessMessages;
{$IFNDEF VER80}
{ Do not use 100% CPU, but slow down transfert on high speed LAN }
Sleep(10);
{$ENDIF}
end;
end;
 
你是想做一个类似于小榕软件之流光那样多线程的程序吗?
 
谢谢,
我通过 TEVENT解决了问题,
效率相当高,超时1000,连续发送1009的数据包,2000次(接收段没有数据的 处理程序 )
没有超时现象.

采用了select()!
 
多人接受答案了。
 
后退
顶部