최대한 빨리 들어오는 TCP 연결을 허용하고 싶습니다. 그러나 데이터를받는 각 연결마다 별도의 스레드가 필요합니다. 나는 API CreateThread
가 처리하는 꽤 걸리는 것을 볼TCP 연결을 빠르게 받아들이고 GUI를 동기화하려면 어떻게합니까?
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;
:
다음은 포트에 listenes 내 TThread 클래스입니다. 연결을 더 빠르게 받아들이는 방법이 있습니까 (accept
은 ListenerThread보다 우선 순위가 높습니다)?
예를 들어, accept
은 2 초 동안 가장 높은 우선 순위를 갖습니다 (2 초 동안 서버가 약 200 개의 연결을 수용했습니다). 그런 다음 한 번에 (200) 개의 스레드를 생성합니다. 조언, 도움을 주실 분은 .
추신 : 연결이 발생하기 전에 스레드를 만들고 싶지 않습니다. (이것은 연결을 제한하고 메모리를 채울 것입니다). 나는 또한 Indy에서 멀리하고 싶다 - 나는 이미 그것을 시험하고 동일한 속도 인 것처럼 보인다.
미리 스레드를 생성하고 싶지는 않지만 단지 그렇게하는 것이 좋습니다. TReceiveThread의 풀 **을 만듭니다 (최대 풀 크기를 초과하는 보스입니다). 풀에서 풀되지 않은 풀을 선택해야합니다. –
연결 풀링, 스레드 풀링 또는 둘 다를 고려하십시오. –
Win32 스레드에서 빠르고 확장 가능한 I/O를 원한다면 사용하는 것이 잘못되었습니다. 연결 당 스레드 모델이 실제로 충분하지 않은 경우 비동기 I/O 및 I/O 완료 포트를 살펴볼 차례입니다. 덧붙여 말하자면, 최근 버전의 Indy는 IOCP를 지원합니다.하지만 여전히 실험적인 것으로 간주됩니다. – afrazier