L
liaotw
Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个线程当中有一个专门的发送函数以发送本线程的缓冲池中的数据。函数的源代码
在下面。
该函数内部包含有延时代码,根据该代码的延时,可以看到,该函数的实际执行时间应该在
62ms左右,但是在实际的运行当中,该函数绝大多数的执行时间在140ms左右。
注意的是:该线程还有另外一个函数用以供其他线程调用,以向缓冲池填写发送的数据。(经
测试,这个函数虽然在本线程当中,但是其执行时间却在其他线程当中,因此该接收函数的
执行不会影响发送函数的执行时间)。
求解决方案或者就该现象进行分析。
我的函数代码如下:
{
const
FSendCyc = 62
SEND_PACKAGE_LEN = 256
}
procedure TSocketThread.SendData;
label
Re;
var
Ret : Integer;
begin
try
if FSendAble then begin
Re:
if SendFlag then begin
//经测试,极少发生Socket异常,因此在Case语句当中的可以不进行考虑时间延迟
if send(FActiveSocket,FSendBufPoolA[0], 256,0) = SOCKET_ERROR then begin
Ret := WSAGetLastError;
case Ret of
WSAEWOULDBLOCK : //现在发送过程被阻塞,需要等待一会儿在进行连接。
begin
Sleep(FSendCyc);
Goto Re;
end;
else
begin
frmMain.SaveLog(1, '头端忙,向头端发送CA数据包时被拒绝, 网络返回编码是:'+IntToStr(Ret));
FSendAble := false;
FConnected := false;
CloseSocket(FActiveSocket); //关闭Socket
end;
end; //end case
end;
offsetA := 0;
SendFlag := False;
end else begin
//经测试,极少发生Socket异常,因此在Case语句当中的可以不进行考虑时间延迟
if send(FActiveSocket,FSendBufPoolB[0], 256,0) = SOCKET_ERROR then begin
Ret := WSAGetLastError;
case Ret of
WSAEWOULDBLOCK : //现在发送过程被阻塞,需要等待一会儿在进行连接。
begin
Sleep(FSendCyc);
Goto Re;
end;
else
begin
frmMain.SaveLog(1, '头端忙,向头端发送CA数据包时被拒绝, 网络返回编码是:'+IntToStr(Ret));
FSendAble := false;
FConnected := false;
CloseSocket(FActiveSocket); //关闭Socket
end;
end;
end;
offsetB := 0;
SendFlag := True;
end;
inc(FSendNO);
//睡眠指定的周期------------------------------------
te := GetTickCount;
if (te - ts) < FSendCyc then begin
Sleep(FSendCyc - (te - ts));
end;
ts := GetTickCount;
//经反复测试,函数执行到这里,显示共消耗70ms
end; //end if FSendAble then begin---------------------------------------
//经反复测试,函数执行到这里,显示共消耗70ms
except
raise;
end;
end;
//经反复测试,函数执行到这里,大多数时候显示共消耗140ms到200ms
在下面。
该函数内部包含有延时代码,根据该代码的延时,可以看到,该函数的实际执行时间应该在
62ms左右,但是在实际的运行当中,该函数绝大多数的执行时间在140ms左右。
注意的是:该线程还有另外一个函数用以供其他线程调用,以向缓冲池填写发送的数据。(经
测试,这个函数虽然在本线程当中,但是其执行时间却在其他线程当中,因此该接收函数的
执行不会影响发送函数的执行时间)。
求解决方案或者就该现象进行分析。
我的函数代码如下:
{
const
FSendCyc = 62
SEND_PACKAGE_LEN = 256
}
procedure TSocketThread.SendData;
label
Re;
var
Ret : Integer;
begin
try
if FSendAble then begin
Re:
if SendFlag then begin
//经测试,极少发生Socket异常,因此在Case语句当中的可以不进行考虑时间延迟
if send(FActiveSocket,FSendBufPoolA[0], 256,0) = SOCKET_ERROR then begin
Ret := WSAGetLastError;
case Ret of
WSAEWOULDBLOCK : //现在发送过程被阻塞,需要等待一会儿在进行连接。
begin
Sleep(FSendCyc);
Goto Re;
end;
else
begin
frmMain.SaveLog(1, '头端忙,向头端发送CA数据包时被拒绝, 网络返回编码是:'+IntToStr(Ret));
FSendAble := false;
FConnected := false;
CloseSocket(FActiveSocket); //关闭Socket
end;
end; //end case
end;
offsetA := 0;
SendFlag := False;
end else begin
//经测试,极少发生Socket异常,因此在Case语句当中的可以不进行考虑时间延迟
if send(FActiveSocket,FSendBufPoolB[0], 256,0) = SOCKET_ERROR then begin
Ret := WSAGetLastError;
case Ret of
WSAEWOULDBLOCK : //现在发送过程被阻塞,需要等待一会儿在进行连接。
begin
Sleep(FSendCyc);
Goto Re;
end;
else
begin
frmMain.SaveLog(1, '头端忙,向头端发送CA数据包时被拒绝, 网络返回编码是:'+IntToStr(Ret));
FSendAble := false;
FConnected := false;
CloseSocket(FActiveSocket); //关闭Socket
end;
end;
end;
offsetB := 0;
SendFlag := True;
end;
inc(FSendNO);
//睡眠指定的周期------------------------------------
te := GetTickCount;
if (te - ts) < FSendCyc then begin
Sleep(FSendCyc - (te - ts));
end;
ts := GetTickCount;
//经反复测试,函数执行到这里,显示共消耗70ms
end; //end if FSendAble then begin---------------------------------------
//经反复测试,函数执行到这里,显示共消耗70ms
except
raise;
end;
end;
//经反复测试,函数执行到这里,大多数时候显示共消耗140ms到200ms