문제

저는 클라이언트-서버 애플리케이션을 구현하기 위해 Indy 10의 TIdCmdTCPServer 구성 요소를 사용합니다.문제는 클라이언트의 요청이 상당히 복잡할 수 있고 서버 애플리케이션의 GUI 부분이 즉시 응답성을 잃는다는 것입니다.로부터 인디 문서, 인디를 얻었습니다.

스레드 우선순위 tpHighest를 사용하여 바인딩에 대한 리스너 스레드를 생성하고 시작합니다.

그 행동을 바꿀 수 있나요?

도움이 되었습니까?

해결책

Rob이 지적했듯이 리스너 스레드의 우선 순위를 변경하지 말고 대신 작업자 스레드의 우선 순위를 낮추십시오. 에 액세스 할 수 있습니다 onconnect () 핸들러 tidcmdtcpserver 인스턴스와 같은 경우 :

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
  // sanity checks need to go here
  TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;

다른 팁

청취 스레드의 우선순위를 낮게 설정해도 문제가 해결되지 않습니다.리스너 스레드가 수행하는 작업은 모두 리스닝뿐이며 이는 CPU를 많이 사용하는 작업이 아닙니다.연결이 도착할 때까지 해당 스레드는 아무 작업도 수행하지 않습니다.Process Explorer와 같은 도구를 사용하여 이를 확인할 수 있습니다.스레드별로 CPU 사용량을 표시할 수 있다고 생각합니다.

우선 순위를 낮게 설정하면 실제로 서버가 나타날 수 있습니다. 더 적은 연결이 도착하면 해당 연결을 수신하는 스레드가 더 낮은 우선순위로 실행되고 연결에 대해 즉시 작업을 수행할 수 없기 때문에 반응적입니다.클라이언트는 서버가 요청 처리를 시작하기 전에 조금 더 기다려야 합니다.

요청은 리스너 스레드에서 처리되지 않습니다.리스너 스레드는 대부분의 작업을 다른 스레드에 위임합니다.TCP 바인딩이 하나만 있는 경우 리스너 스레드는 하나만 있지만 많은 동시 연결을 처리할 수 있습니다.리스너가 하나만 있음에도 불구하고 각 연결은 별도의 스레드에 의해 처리됩니다.

어쨌든 서버 객체의 우선순위를 처리하여 우선순위를 변경할 수 있습니다. OnBeforeListenerRun 이벤트.에 대한 참조를 받습니다. TIdThread 이는 리스너 스레드를 나타내므로 해당 스레드에 다른 값을 할당할 수 있습니다. Priority 재산.또한 소스 코드가 있으므로 들어가서 정의를 변경할 수 있습니다. tpListener 일정한 IdGlobalCore.pas.코드는 해당 값을 사용합니다. tpHighest 곧장.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top