我想尽快接受传入的 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) 个线程,或类似的操作。
建议,帮助将不胜感激。
最佳答案
印第出了什么问题?它随 Delphi 一起提供,其 TIdTCPServer
组件可以完成您所要求的一切。它使用每个监听端口的单独工作线程接受新连接,因此主线程不会等待。每个接受的客户端都在其自己的工作线程中运行。并且客户端线程可以选择被池化(不管您怎么想,池不必限制您可以接受的连接数量,只是允许在任何给定时刻有多少线程处于空闲状态等待重用)。
如果您遇到速度问题,请随时向 Indy 的开发人员报告。我怀疑您的速度问题可能与您使用它的方式有关,而不是它本身的问题。
关于delphi - 如何快速接受 TCP 连接并同步我的 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18240051/