我有一个线程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;请问是不是并发处理时的问题.那有没有什么好的解决方案?

解决方案 »

  1.   

    [2010-8-1 3:30:12] [Hint] TPlayerThread.ServerSocket.Active Successful(1/0.0.0.0:9101)
    [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
      

  2.   

    为什么要用多线程?Socket异步处理不就可以了吗?