2013-08-14 2 views
1

최대한 빨리 들어오는 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에서 멀리하고 싶다 - 나는 이미 그것을 시험하고 동일한 속도 인 것처럼 보인다.

+5

미리 스레드를 생성하고 싶지는 않지만 단지 그렇게하는 것이 좋습니다. TReceiveThread의 풀 **을 만듭니다 (최대 풀 크기를 초과하는 보스입니다). 풀에서 풀되지 않은 풀을 선택해야합니다. –

+1

연결 풀링, 스레드 풀링 또는 둘 다를 고려하십시오. –

+1

Win32 스레드에서 빠르고 확장 가능한 I/O를 원한다면 사용하는 것이 잘못되었습니다. 연결 당 스레드 모델이 실제로 충분하지 않은 경우 비동기 I/O 및 I/O 완료 포트를 살펴볼 차례입니다. 덧붙여 말하자면, 최근 버전의 Indy는 IOCP를 지원합니다.하지만 여전히 실험적인 것으로 간주됩니다. – afrazier

답변

5

인디가 잘못 되었나요? Delphi와 함께 제공되며, TIdTCPServer 구성 요소는 사용자가 원하는 모든 것을 처리합니다. 수신 대기 포트마다 별도의 작업자 스레드를 사용하여 새 연결을 허용하므로 주 스레드는 대기하지 않습니다. 허용 된 각 클라이언트는 자체 작업자 스레드에서 실행됩니다. 또한 클라이언트 스레드는 선택적으로 풀링 될 수 있습니다 (풀이 허용 할 수있는 연결 수를 제한 할 필요가 없으며 재사용 대기중인 임의의 시간에 유휴 상태로 있도록 허용되는 스레드 수).

속도 문제가있는 경우 Indy 개발자에게 알려 주시기 바랍니다. 나는 당신의 속도 문제가 그 문제 자체가 아닌, 어떻게 사용하고 있는지와 관련이 있다고 생각합니다.

+0

저는이 도구를 사용했습니다 : http://www.poisonivy-rat.com/ 여기에서 스트레스 터를 사용했습니다 : http://stackoverflow.com/questions/11285593/virtualtreeview-add-roots-with-threads 연결이 매우 빠르며 똑같이하고 싶습니다. 그러나 나는 그것을 성취 할 방법을 모른다. Indy를 사용했지만 TThread를 만드는 데 영원히 걸릴 것 같습니다. –

+1

예, 스레드를 만드는 것은 OS 관점에서 볼 때 비용이 많이 드는 작업이며 실행을 시작하는 데 시간이 걸릴 수 있습니다. 이것이 스레드 풀링의 목적입니다. Indy는'TIdThreadMgrPool' (Indy 9) 또는'TIdSchedulerOfThreadPool' (Indy 10) 구성 요소를 가지고 있습니다.이 구성 요소는'TIdTCPServer'에 첨부 될 수 있습니다. –

+0

당신은 친절하고 모범이 될 수 있습니까? –