我有一个线程TPlayerThread.它用于处理对象TBaseObject.TBaseObject在创建时会同时创建一个ClientSocket并连接相应的服务器.但是遇到的问题就是ClientSocket在接收数据时会经常产生错误.以下是代码procedure TBaseObject.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
nCode, nLength: Integer;
pBuf: Pointer;
BaseObject: TBaseObject;
begin
nCode := 0;
BaseObject := TBaseObject(Socket.Index);
nCode := -1;
if BaseObject <> nil then
begin
nCode := -2;
nLength := Socket.ReceiveLength;
if nLength > 0 then
begin
try
nCode := -3;
pBuf := AllocMem(nLength);
nCode := -4;
Socket.ReceiveBuf(pBuf^, nLength);
nCode := -5;
BaseObject.NewUserBuf(pBuf, nLength, True);
nCode := -6;
except
on E: Exception do
MainOutMessage(format('[Exception] TBaseObject.ClientSocketRead(%d) %s', [nCode, E.Message]));
end;
end
else
MainOutMessage(format('[Exception] TBaseObject.ClientSocketRead Length(%d)', [nLength]));
BaseObject.ReceiveTime := GetTickCount();
end;
end;
procedure TBaseObject.NewUserBuf(pBuf: Pointer; nLength: Integer; boSend: Boolean);
procedure MainOutBuf(); // 输出数据内容,Debug用
var
i: Integer;
bText: PByte;
sText: string;
begin
bText := PByte(pBuf);
for i := 0 to nLength - 1 do
begin
sText := sText + IntToHex(bText^, 2) + #32;
Inc(bText);
end;
MainOutMessage('[Debug] ReceiveBuf(' + IntToStr(nLength) + '): ' + sText);
end;var
nCode: Integer;
pReceiveBuf: pTReceiveBuf;
begin
nCode := 0;
try
nCode := -1;
New(pReceiveBuf);
nCode := -2;
pReceiveBuf.nSize := nLength;
nCode := -3;
pReceiveBuf.Buf := pBuf;
nCode := -4;
if boSend then
begin
if Assigned(m_SendBufList) then
m_SendBufList.Add(pReceiveBuf)
else
MainOutMessage(format('[Exception] TBaseObject.NewUserBuf(SendBufList) %s', [BoolToStr(m_boTerminate)]));
end
else
begin
if Assigned(m_ReceiveBufList) then
m_ReceiveBufList.Add(pReceiveBuf)
else
MainOutMessage(format('[Exception] TBaseObject.NewUserBuf(ReceiveBuf) %s', [BoolToStr(m_boTerminate)]));
end;
nCode := -5;
except
on E: Exception do
begin
MainOutMessage(format('[Exception] TBaseObject.NewUserBuf(%d:%d:%s) %s', [nCode, nLength, BoolToStr(m_boTerminate), E.Message]));
MainOutBuf();
end;
end;
end;请问是不是并发处理时的问题.那有没有什么好的解决方案?
var
nCode, nLength: Integer;
pBuf: Pointer;
BaseObject: TBaseObject;
begin
nCode := 0;
BaseObject := TBaseObject(Socket.Index);
nCode := -1;
if BaseObject <> nil then
begin
nCode := -2;
nLength := Socket.ReceiveLength;
if nLength > 0 then
begin
try
nCode := -3;
pBuf := AllocMem(nLength);
nCode := -4;
Socket.ReceiveBuf(pBuf^, nLength);
nCode := -5;
BaseObject.NewUserBuf(pBuf, nLength, True);
nCode := -6;
except
on E: Exception do
MainOutMessage(format('[Exception] TBaseObject.ClientSocketRead(%d) %s', [nCode, E.Message]));
end;
end
else
MainOutMessage(format('[Exception] TBaseObject.ClientSocketRead Length(%d)', [nLength]));
BaseObject.ReceiveTime := GetTickCount();
end;
end;
procedure TBaseObject.NewUserBuf(pBuf: Pointer; nLength: Integer; boSend: Boolean);
procedure MainOutBuf(); // 输出数据内容,Debug用
var
i: Integer;
bText: PByte;
sText: string;
begin
bText := PByte(pBuf);
for i := 0 to nLength - 1 do
begin
sText := sText + IntToHex(bText^, 2) + #32;
Inc(bText);
end;
MainOutMessage('[Debug] ReceiveBuf(' + IntToStr(nLength) + '): ' + sText);
end;var
nCode: Integer;
pReceiveBuf: pTReceiveBuf;
begin
nCode := 0;
try
nCode := -1;
New(pReceiveBuf);
nCode := -2;
pReceiveBuf.nSize := nLength;
nCode := -3;
pReceiveBuf.Buf := pBuf;
nCode := -4;
if boSend then
begin
if Assigned(m_SendBufList) then
m_SendBufList.Add(pReceiveBuf)
else
MainOutMessage(format('[Exception] TBaseObject.NewUserBuf(SendBufList) %s', [BoolToStr(m_boTerminate)]));
end
else
begin
if Assigned(m_ReceiveBufList) then
m_ReceiveBufList.Add(pReceiveBuf)
else
MainOutMessage(format('[Exception] TBaseObject.NewUserBuf(ReceiveBuf) %s', [BoolToStr(m_boTerminate)]));
end;
nCode := -5;
except
on E: Exception do
begin
MainOutMessage(format('[Exception] TBaseObject.NewUserBuf(%d:%d:%s) %s', [nCode, nLength, BoolToStr(m_boTerminate), E.Message]));
MainOutBuf();
end;
end;
end;请问是不是并发处理时的问题.那有没有什么好的解决方案?
[2010-8-1 3:30:12] [Hint] TMainForm.InitializePlayerThread Successful(2)
[2010-8-1 5:08:48] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address B84C05F8
[2010-8-1 5:08:48] [Debug] ReceiveBuf(13): 44 00 00 06 00 02 00 0C 00 56 C2 1E 04
[2010-8-1 5:09:18] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address B84C05F8
[2010-8-1 5:09:18] [Debug] ReceiveBuf(13): 44 00 00 06 00 03 00 0C 00 87 37 1F 04
[2010-8-1 5:09:48] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address B84C05F8
[2010-8-1 5:09:48] [Debug] ReceiveBuf(13): 44 00 00 06 00 04 00 0C 00 B8 AC 1F 04
[2010-8-1 5:10:18] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address B84C05F8
[2010-8-1 5:10:18] [Debug] ReceiveBuf(13): 44 00 00 06 00 05 00 0C 00 EA 21 20 04
[2010-8-1 5:10:48] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address B84C05F8
[2010-8-1 5:10:48] [Debug] ReceiveBuf(13): 44 00 00 06 00 06 00 0C 00 1B 97 20 04
[2010-8-1 6:05:02] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 437065F8
[2010-8-1 6:05:02] [Debug] ReceiveBuf(13): 44 00 00 06 00 02 00 0C 00 85 3F 52 04
[2010-8-1 6:05:32] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 437065F8
[2010-8-1 6:05:32] [Debug] ReceiveBuf(13): 44 00 00 06 00 03 00 0C 00 B6 B4 52 04
[2010-8-1 6:06:02] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 437065F8
[2010-8-1 6:06:02] [Debug] ReceiveBuf(13): 44 00 00 06 00 04 00 0C 00 E9 29 53 04
[2010-8-1 6:06:32] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 437065F8
[2010-8-1 6:06:32] [Debug] ReceiveBuf(13): 44 00 00 06 00 05 00 0C 00 1B 9F 53 04
[2010-8-1 6:07:02] [Exception] TBaseObject.NewUserBuf(-4:13:) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 437065F8
[2010-8-1 6:07:02] [Debug] ReceiveBuf(13): 44 00 00 06 00 06 00 0C 00 4C 14 54 04
[2010-8-1 6:42:38] [Exception] TBaseObject.NewUserBuf(-4:13:0) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 0000000C
[2010-8-1 6:42:38] [Debug] ReceiveBuf(13): 44 00 00 06 00 02 00 0C 00 D5 AB 74 04
[2010-8-1 6:43:08] [Exception] TBaseObject.NewUserBuf(-4:13:0) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 0000000C
[2010-8-1 6:43:08] [Debug] ReceiveBuf(13): 44 00 00 06 00 03 00 0C 00 06 21 75 04
[2010-8-1 6:43:38] [Exception] TBaseObject.NewUserBuf(-4:13:0) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 0000000C
[2010-8-1 6:43:38] [Debug] ReceiveBuf(13): 44 00 00 06 00 04 00 0C 00 38 96 75 04
[2010-8-1 6:44:08] [Exception] TBaseObject.NewUserBuf(-4:13:0) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 0000000C
[2010-8-1 6:44:08] [Debug] ReceiveBuf(13): 44 00 00 06 00 05 00 0C 00 6A 0B 76 04
[2010-8-1 6:44:38] [Exception] TBaseObject.NewUserBuf(-4:13:0) Access violation at address 00433ED3 in module 'ProxyServer.exe'. Read of address 0000000C
[2010-8-1 6:44:38] [Debug] ReceiveBuf(13): 44 00 00 06 00 06 00 0C 00 9D 80 76 04m_boTerminate是我用来调试看错误产生时,对象是否还存在的布尔变量,在Create时为False,在Destroy时为True