以前的:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
//
end;
现在的:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);
begin
//
end;请问这个AThread起什么作用,能否结合例子说明下,非常感谢!
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
//
end;
现在的:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);
begin
//
end;请问这个AThread起什么作用,能否结合例子说明下,非常感谢!
var
PeerIP: string;
PeerPort : TIdPort;
ByteCount: Integer;
begin
if FBinding.Select(AcceptWait) then try
// Doublecheck to see if we've been stopped
// Depending on timing - may not reach here if it is in ancestor run when thread is stopped
if not Stopped then begin
SetLength(FBuffer, FServer.BufferSize);
ByteCount := GStack.ReceiveFrom(FBinding.Handle, FBuffer, PeerIP, PeerPort, FBinding.IPVersion);
SetLength(FBuffer, ByteCount);
FBinding.SetPeer(PeerIP, PeerPort, FBinding.IPVersion);
if FServer.ThreadedEvent then begin
UDPRead;
end else begin
Synchronize(UDPRead);
end;
end;
except
// exceptions should be ignored so that other clients can be served in case of a DOS attack
on E : Exception do
begin
FCurrentException := E.Message;
FCurrentExceptionClass := E.ClassType;
if FServer.ThreadedEvent then begin
UDPException;
end else begin
Synchronize(UDPException);
end;
end;
end;
end;
AData: TIdBytes; ABinding: TIdSocketHandle);
var
Msg: String;
Info: String;
begin
//..... 省略过程
if Msg = 'Update' then
UpdateData(IP, Info)
else if Msg = 'GetInfo' then
Info := GetInfo(IP);
end;procedure TFrom1.UpdateData(const IP, Info: String);
begin
try
dxMemData.DisableControls;
dxMemData.ProgrammedFilter := False;
dxMemData.Filtered := False;
dxMemData.ProgrammedFilter := True;
dxMemData.First;
while not dxMemData.Eof do
begin
if dxMemData.FieldByName('ip').AsString = IP then
begin
dxMemData.FilterList.Add(Pointer(dxMemData.CurRec + 1));
Break;
end;
dxMemData.Next;
end;
dxMemData.Filtered := True;
finally
dxMemData.EnableControls;
end;
if not dxMemData.IsEmpty then
begin
dxMemData.DisableControls;
dxMemData.Edit;
dxMemData.FieldByName('ip').asString := IP;
dxMemData.FieldByName('info').asString := Info;
dxMemData.Post;
dxMemData.EnableControls;
end else
begin
dxMemData.DisableControls;
dxMemData.Insert;
dxMemData.FieldByName('ip').asString := IP;
dxMemData.FieldByName('info').asString := Info;
dxMemData.Post;
dxMemData.EnableControls;
end;
end;function TFrom1.UpdateData(const IP: String): String;
begin
try
dxMemData.DisableControls;
dxMemData.ProgrammedFilter := False;
dxMemData.Filtered := False;
dxMemData.ProgrammedFilter := True;
dxMemData.First;
while not dxMemData.Eof do
begin
if dxMemData.FieldByName('ip').AsString = IP then
begin
dxMemData.FilterList.Add(Pointer(dxMemData.CurRec + 1));
Break;
end;
dxMemData.Next;
end;
dxMemData.Filtered := True;
finally
dxMemData.EnableControls;
end; dxMemData.First;
Result := dxMemData.FieldByName('info').asString;
end;请问是否设置ThreadedEvent = False 以便Synchronize()呢?
dxMemData.DisableControls;
.......
dxMemData.EnableControls;这个需要用Synchronize同步吗?我就是担心这个会影响结果。
dxMemData.DisableControls;
.......
dxMemData.EnableControls;一个线程A执行到dxMemData.DisableControls;的时候,另一个线程却在执行dxMemData.EnableControls;那样不就影响了A继续往下的功能么?
case MsgType of
1: //A.....
2: //B.....
3: //C.....
end;其中A,B,C都有对dxMemData的操作,UDP接包的时候,有触发A,有触发B,也有触发C等。
既然都是线程触发的,是不是就会存在多个线程呢?那样彼此之间是否就需要同步?非常感谢SQLDebug_Fan!