Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi IDTCP客户端不再接收数据_Delphi_Thread Safety_Firemonkey_Tcp Ip - Fatal编程技术网

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
中不存在。