procedure  TThreadQuery.Execute;
var
  Qry:TADOQuery;
  i:Integer;
   ConnString:WideString;
    FSQLString:string;
begin
  { Place thread code here }
  FreeOnTerminate:=True;
  CoInitialize(nil);
    //必须调用(需Uses ActiveX)
  Qry:=TADOQuery.Create(nil);  try
    ConnString:=frmServer.ADOConnection1.ConnectionString;
    Qry.ConnectionString:=ConnString;   //必须有自己的连接
    Qry.Close;
    Qry.SQL.Clear;
    Qry.SQL.add(sqlstring) ;    try
        qry.ExecSQL ;
    except
       exit;       end;  finally
      Qry.Free;
  end ;
  CoUninitialize;
end  ;
procedure TfrmServer.FServerFRecvSocket(FDIChannel: TObject;
  FDIBuffer: TDIBuffer; dwIoSize: Cardinal);
var
  FSendBuffer: TDIBuffer;
   s:string;
   i:integer;
   titem:Tlistitem;
  begin
  with (FDIChannel as TDIClientContext) do begin
     FSendBuffer := GetFreeDIBuffer(IO_WSA_SEND);
     if FSendBuffer<>nil then begin
      FSendBuffer.CreatePackage(FDIBuffer.GetBuffer, FDIBuffer.GetUsed);
      try
      titem:=listview1.Items.Add;
      titem.Caption:= m_sRemoteIP;
      titem.SubItems.Add(inttostr(m_RemotePort))  ;
      titem.SubItems.Add(FSendBuffer.GetBufferString(true))  ;
      titem.SubItems.Add(datetimetostr(FSocketConnDateTimeTime )) ;
      try
      ip:= m_sRemoteIP+':'+inttostr(m_RemotePort);
      sleep(5);
      rev_data:=FSendBuffer.GetBufferString(true);
      sqlstring:='insert into tcpip_insert(ip_address,ev3_id) values('''+ip+''','''+rev_data+''' )';
      finally
      q1.Execute;
      sleep(5);
      end;
     finally
      FSendBuffer.InitBuffer;
      SendStream(FSendBuffer);    end;
  end;
end;
end;数据插入的时候m_RemotePort有漏掉,应该是线程错乱所致,是不是我的线程写的有问题,求指教!

解决方案 »

  1.   

    你的设计上有问题,不要将SOCKET部分,数据写入,界面回写混在一起。
      

  2.   

    SOCKET部分仅负责将收到的数据生成一个对象,然后放到一个列表中。发个消息通知界面,在LISTVIEW中显示。
    另一个线程只负责从这个列表中读取数据,然后执行SQL,不要每次都创建一个ADOQ。将执行结果通知界面。更新LISTVIEW中显示内容。
      

  3.   

    您的意思是把数据插入放在listview的更新事件中??