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有漏掉,應該是執行緒錯亂所致,是不是我的執行緒寫的有問題,求指教!
uj5u.com熱心網友回復:
你的設計上有問題,不要將SOCKET部分,資料寫入,界面回寫混在一起。uj5u.com熱心網友回復:
SOCKET部分僅負責將收到的資料生成一個物件,然后放到一個串列中。發個訊息通知界面,在LISTVIEW中顯示。另一個執行緒只負責從這個串列中讀取資料,然后執行SQL,不要每次都創建一個ADOQ。將執行結果通知界面。更新LISTVIEW中顯示內容。
uj5u.com熱心網友回復:
您的意思是把資料插入放在listview的更新事件中??uj5u.com熱心網友回復:
資料是資料,顯示是顯示,只是在合適的時候去通知界面去資料串列中讀取資料顯示。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103132.html
標籤:非技術區
