delphi - 如何快速接受 TCP 连接并同步我的 GUI?

标签 delphi winsock vcl delphi-xe4

我想尽快接受传入的 TCP 连接。但我还希望为每个接收数据的连接提供一个额外的线程。

这是我监听端口的 TThread 类:

procedure TListenThread.Execute;
var
  iSize     : Integer;
begin
  ConnectionAttempts := 0;
  while not (terminated) do begin
    iSize := SizeOf(cAddr);
    hClient := Accept(hServer, @cAddr, @iSize);
    if (hClient <> INVALID_SOCKET) then begin
      inc (ConnectionAttempts);
      SynchIP  := inet_ntoa(cAddr.sin_addr);
      Synchronize(WriteToLog); // Processes very fast!
      with TReceiveThread.Create(TRUE) do begin // This takes the longest...
        FreeOnTerminate   := TRUE;
        hSocket           := hClient;
        TheForm           := aForm;
        Host              := SynchIP;
        Resume;
      end;
    end;
  end;
end;

我发现 API CreateThread 需要相当长的时间来处理。 有没有办法更快地接受连接(因此 accept 的优先级高于 ListenerThread)?

例如,accept 在 2 秒内具有最高优先级(在 2 秒内,服务器已接受大约 200 个连接),然后立即创建 (200) 个线程,或类似的操作。 建议,帮助将不胜感激。

PS: 我不想在连接发生之前创建任何线程。 (这会限制连接并会填满内存)。我也想远离 Indy - 我已经测试过它,它的速度似乎是相同的。

最佳答案

印第出了什么问题?它随 Delphi 一起提供,其 TIdTCPServer 组件可以完成您所要求的一切。它使用每个监听端口的单独工作线程接受新连接,因此主线程不会等待。每个接受的客户端都在其自己的工作线程中运行。并且客户端线程可以选择被池化(不管您怎么想,池不必限制您可以接受的连接数量,只是允许在任何给定时刻有多少线程处于空闲状态等待重用)。

如果您遇到速度问题,请随时向 Indy 的开发人员报告。我怀疑您的速度问题可能与您使用它的方式有关,而不是它本身的问题。

关于delphi - 如何快速接受 TCP 连接并同步我的 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18240051/

相关文章:

delphi - 如何将字符串从 Delphi 程序的一个实例发送到另一个实例?

c - Winsock 发送函数无限期等待

winsock - 如何调查仅在配备 NVIDIA Quadro 的机器上经常发生的客户端 WSAECONNABORTED?

listview - 如何通过代码使ListView VCL折叠/展开?

delphi - 为什么当我更改属性时我的自定义组件没有更新?

delphi - 将字节数组转换为 PAnsiChar

delphi - 创建数据库感知组件 - TFieldDataLink.Edit 导致字段重新加载

delphi - 在主/明细关系上使用DataSet和Table之间的区别?

c++ - 无法分配请求的地址,C++ UDP 套接字

delphi - 如何将滚动条添加到TComponent?