首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi持久连接中的TClientSocket

Delphi持久连接中的TClientSocket
EN

Stack Overflow用户
提问于 2016-09-06 17:03:14
回答 1查看 391关注 0票数 0

我有一个使用TClientSocket用Delphi编写的应用程序,它向另一个用C#编写的应用程序发送数据。由于许多原因,C#应用程序响应缓慢,阻塞了我的Delphi应用程序,不尊重我设置的超时。

我的Delphi应用程序的响应如下:

代码语言:javascript
复制
Sock.Socket.ReceiveText

这将导致应用程序等待响应。但是,如果我这样做,应用程序等待并尊重超时:

代码语言:javascript
复制
while not receiveData do
begin
  if Sock.Socket.ReceiveLength > 0 then
  begin
    receiveData := True;
  end;
  Inc(Cont); 
  Sleep(100);

  if (Cont > 10) then
    raise Exception.Create('Timeout');
end;

我的Delphi应用程序发送了两个请求。第一次超时,但C#仍在处理它。然后我的Delphi应用程序发送第二个请求,这次C#为第一个请求发送响应。

第二个请求会接收第一个请求的数据吗?或者,当我在Delphi中超时时,他们会交叉信息吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-06 17:23:28

一旦您的Delphi代码超时,它就会忘记第一个请求,但是您的C#代码不知道这一点。由于没有删除连接,第二个请求实际上将接收第一个请求的响应数据。通过实现超时逻辑,然后忽略超时的原因,您将使您的两个应用程序彼此不同步。因此,要么使用更长的超时时间(或者根本不使用超时),要么在发生超时时删除连接。

至于您的Delphi应用程序冻结,只有当您在阻塞模式下使用TClientSocket组件并在主UI线程的上下文中执行您的读取时,才会发生这种情况。您不应该在主UI线程中使用阻塞模式。以下任一项:

  1. 在非阻塞模式下使用TClientSocket,只在OnRead事件中进行所有读取,并且不读取超过ReceiveLength指示的内容。
  2. 在阻塞模式中使用TClientSocket,并在工作线程中执行所有读取操作,然后只有在有数据可供其处理时才向主UI线程发出信号(最好是处理工作线程中的数据,并在进行UI更新时只与主线程同步)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39354325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档