Delphi IDTCP客户端不再接收数据
直到几个小时前,这段非常简单的代码还可以正常工作 我正在使用Delphi IDTCP客户端不再接收数据,delphi,thread-safety,firemonkey,tcp-ip,Delphi,Thread Safety,Firemonkey,Tcp Ip,直到几个小时前,这段非常简单的代码还可以正常工作 我正在使用TTimer从IdTCPClient 组成部分 不知怎的,它已经不起作用了。当尝试ReadLn时,它只是冻结 procedure TFormLogin.TimerGetListTimer(Sender: TObject); var genset_response: String; begin TimerGetList.Enabled := false; IdTCPClient1.IOHandler.WriteLn('GE
TTimer
从IdTCPClient
组成部分
不知怎的,它已经不起作用了。当尝试ReadLn
时,它只是冻结
procedure TFormLogin.TimerGetListTimer(Sender: TObject);
var
genset_response: String;
begin
TimerGetList.Enabled := false;
IdTCPClient1.IOHandler.WriteLn('GET_LIST');
genset_response := IdTCPClient1.Socket.ReadLn();
end;
我怀疑ReadLn
正在阻止主线程等待服务器线程调用WriteLn()
- 如果我执行
genset\u响应:=IdTCPClient1.Socket.ReadString(8)代码>可以从响应正文中获取前8个字母
- 如果我执行ShowMessage(IdTCPClient1.IOHandler.ReadLn(“”,200))代码>返回空白
如何在不阻塞主线程的情况下正确地从服务器读取数据?将其移动到单独的线程,就像前面提到的几十个类似问题一样。在发布之前做一些研究,从这里的简单搜索开始。您的症状表明服务器正在发送一些数据,但没有发送
LF
字符。在等待该角色时,您确实正在阻止主UI线程。使用tid防冻液
可以避免UI冻结,但也会导致计时器出现重入问题。不管怎样,一定要将代码移动到工作线程中,不要使用计时器。我使用的是FMX。没有理由使用tid防冻液
,因为它是在移动平台上运行的。您能告诉我如何使用移动设备将其移动到单独的线程中吗?之前提出的其他几十个类似问题主要建议在OnExecute
方法中使用,该方法在FMX
中不存在。