数据发送出去以后用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;