使用的東西更像這個:
procedure TForm1.Timer2Timer(Sender: TObject);
var
receivedtext: string;
begin
with IdTCPClient1 do
begin
try
if IOHandler.InputBufferIsEmpty then
begin
IOHandler.CheckForDataOnSource(0);
IOHandler.CheckForDisconnect;
if IOHandler.InputBufferIsEmpty then Exit;
end;
receivedtext := IOHandler.ReadLn;
except
Timer2.Enabled := False;
Exit;
end;
if receivedtext <> '' then
ShowMessage(receivedtext);
end;
end;
隨着中說,這種代碼將得到更好的使用工作線程,而不是一個計時器來實現。
1 - 創建一個從TThread
(文件>新建>其它> Thread對象)衍生
type
TDataEvent = procedure(const Data: string) of object;
TReadingThread = class(TThread)
private
FClient: TIdTCPClient;
FData: string;
FOnData: TDataEvent;
procedure DataReceived;
protected
procedure Execute; override;
public
constructor Create(AClient: TIdTCPClient); reintroduce;
property OnData: TDataEvent read FOnData write FOnData;
end;
constructor TReadingThread.Create(AClient: TIdTCPClient);
begin
inherited Create(True);
FClient := AClient;
end;
procedure TReadingThread.Execute;
begin
while not Terminated do
begin
FData := IdTCPClient1.IOHandler.ReadLn;
if (FData <> '') and Assigned(FOnData) then
Synchronize(DataReceived);
end;
end;
procedure TReadingThread.DataReceived;
begin
if Assigned(FOnData) then
FOnData(FData);
end;
2一個新類 - 修改您的連接代碼:
IdTCPClient1.Connect;
try
Thread := TReadingThread.Create(IdTCPClient1);
Thread.OnData := DataReceived;
Thread.Resume;
except
IdTCPClient1.Disconnect;
raise;
end;
...
if Assigned(Thread) then Thread.Terminate;
try
IdTCPClient1.Disconnect;
finally
if Assigned(Thread) then
begin
Thread.WaitFor;
FreeAndNil(Thread);
end;
end;
...
procedure TForm1.DataReceived(const Data: string);
begin
ShowMessage(Data);
end;
是否'receivedtext =''= false'甚至編譯? (請顯示您的真實代碼) – mjn
爲什麼要清除InputBuffer?經過成功的Read ...操作後,Indy將從InputBuffer中刪除讀取的字節。 – mjn
爲什麼你有這個代碼在一個計時器?使用如圖所示的代碼,您將會遇到重入問題,特別是在計時器值爲8ms的情況下。 –