帮忙分析一个网络通讯线程代码(在xp上运行正常、win7-32位运行2-3天就会报错)
本帖最后由 yct0605 于 2012-09-25 13:05:11 编辑 大概有10个左右的显示数据需要循环发送,每次发送创建线程,如果发送失败,释放失败的线程,以前的代码在xp上运行正常,最近一个现场使用的是win7-32位系统,程序运行2-3天就会报错,大家帮忙分析以下原因,多谢了:
//发送线程
type TSendThread = Class(TThread)
private
pingN,pingX,pingMkType:byte;
pingW,pingH:word ;
function SendData(pPN:byte;pW,pH:integer; Px,pMkType:byte): byte;
protected
procedure Execute; override;
public
constructor Create(pPN,piW,piH:word; piX,piMKT:byte);
{---TSendThread------}
constructor TSendThread.Create(pPN,piW,piH:word; piX,piMKT:byte);
begin
pingN:=pPN;
pingW:=piW;
pingH:=piH;
pingX:=piX;
pingMkType:=piMKT;
inherited Create(False);
end;
procedure TSendThread.EXecute;
var
tem:byte;
begin
tem:=1;
case pingN of
1..6: tem:=SDB(pingN, pingW, pingH, pingX, pingMkType);
end;
ReturnValue:=tem;
end;
function TSendThread.SDB(pPN:byte;pW,pH:integer; Px,pMkType:byte): byte;
var
GInitData : TWSADATA;
begin
try
WSAStartup($101, GInitData);
Application.ProcessMessages;
try
case pPN of
1..6:begin
//获取发送数据
end;
end;
if STCPIPDB(发送数据判断)=0 then
result:=1
else
result:=2;
finally
WSACleanup;
end;
except
result:=0;
end;
end;
//应用
for i:=1 to 6 do
begin
SendThread[i]:=TSendThread.Create(i,pwh[pw[i]],pwh[ph[i]],pstype,pimk); //创建线程
try
if WaitForSingleObject(SendThread[i].Handle,LEDConnTimeOut)=Wait_Object_0 then
begin
tem:=SendThread[i].ReturnValue;
//显示发送状态
end
else
begin
SendThread[i].Terminate;
//显示发送状态
end;
end;
Exit;
end;
iSet := 1;
err := setsockopt(FSocket, IPPROTO_TCP, TCP_NODELAY, PChar(@iSet), SizeOf(iSet));
if Err = Socket_Error then
begin
err := WSAGetLastError;
ss := 'Set TCP_NODELAY error:' + IntToStr(err);
DoError(self, seSetting, PChar(ss), err);
Exit;
end;
except
on E: Exception do
begin
err := WSAGetLastError;
ss := 'Create socket abnormal:' + inttostr(err) + ',' + E.message;
DoError(self, seAbnormal, PChar(ss), err);
end;
end;
end; //end of if Fsocket = Invalid_socket
end;
[解决办法]
做个运行日志来分析
[解决办法]
用静态线程
[解决办法]
报的错是什么错呢,这样的问题,一般是很难回答的。
[解决办法]
你这不是构成了多线程吗,使用临界区试试
另外,如果是比较频繁的创建线程,不如只创建一次
[解决办法]
try catch 抓错呗。
找到原因,再研究。