我希望尽快接受传入的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.:我不想在连接发生之前创建任何线程。(这将限制连接并填充内存)。我也想远离印地——我已经测试过了,它似乎也是一样的速度。
TIdTCPServer
组件可以满足您的所有要求。它在每个侦听端口使用一个单独的工作线程来接受新的连接,因此主线程不会等待。每个接受的客户端都在自己的工作线程中运行。客户端线程可以选择性地进行池化(不管你怎么想,池不必限制你可以接受的连接数量,只需要限制在任何给定时刻允许有多少线程空闲等待重用)。
如果您有速度问题,请随时向Indy的开发人员报告。我怀疑你的速度问题可能与你如何使用它有关,而不是它本身的问题。