【问题标题】:IdTcpClient repeat ReadLn commandIdTcpClient 重复 ReadLn 命令
【发布时间】:2014-05-28 08:56:29
【问题描述】:

我想在 Idtcpclient 上创建一个重复 ReadLn 命令的函数。 但是我该怎么做呢?我不想使用计时器,因为计时器很慢。 我已经在谷歌上搜索过,但我不明白。..

【问题讨论】:

  • 这听起来像是服务器的任务,而不是客户端的任务......
  • 但是当我向客户端发送命令时,客户端无法读取它......这就是我想重复它的原因。

标签: delphi indy delphi-xe5


【解决方案1】:

客户端可以放在单独的线程中,使用循环重复ReadLn,直到成功。超时可以作为 ReadLn 的参数给出,以便下一次尝试将在超时间隔之后发生。确保处理连接丢失,例如通过循环重新连接。

【讨论】:

  • 但是当我将 readln 放在一个循环中时,应用程序运行得非常慢,就像我把它放在一个计时器中一样
  • @jwz 如果 ReadLn 在单独的线程中,为什么主应用程序运行缓慢?线程会一直等到有数据,如果没有数据就重复。在有数据之前不会触及主应用线程。
  • 哦,在一个单独的线程中,但我该怎么做呢?我现在尝试使用 backgroundworker 组件,但我不知道它是如何工作的,我可以制作事件...
  • @mjn:线程情况下不需要使用超时。让ReadLn() 阻塞直到数据到达,然后再次调用ReadLn() 并让它阻塞,根据需要重复。当发生断开连接时,被阻塞的ReadLn() 将引发异常,然后可以根据需要使用该异常来终止线程或重新连接等。
  • @jwz104:您可以使用TIdThreadComponent 组件,该组件运行一个工作线程并在该线程内触发其OnRun 事件(和其他事件)。或者您可以从TThread 派生一个新类并覆盖Execute() 方法,然后在需要时创建该类的实例。搜索一下,有很多使用TIdTCPClient 进行线程读取的例子。
猜你喜欢
  • 2015-08-22
  • 2016-11-01
  • 1970-01-01
  • 2011-11-10
  • 2016-12-03
  • 2020-06-24
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多