2009-10-07 2 views
1

Indy의 TIdTCPServer (D2009, Indy 10)를 사용하여 클라이언트 애플리케이션과 통신합니다. OnExecute 메서드에서 작업을 만들고 대기열에 넣습니다. 작업자 스레드는 작업을 실행하여 전송 대기열에 넣습니다. 그런 다음 전송 큐는 클라이언트에 응답을 보냅니다.Indy, 쓰레드 전송 및 파기 된 컨텍스트

보내는 스레드에서 서버의 컨텍스트 목록을 반복하고 작업에 저장된 IP 및 포트 정보와 일치하는 컨텍스트를 찾습니다. 그런 다음 때로는 액세스 위반을 유발하는 여러 가지 send 명령을 따르십시오 (나는 컨텍스트가 전송 중에 손상된다는 것을 추측합니다).

지금 질문 : 응답을 보내기 전에 컨텍스트가 닫히지 않도록하려면 어떻게해야합니까? Indy가 별도의 스레드에서 보내거나 Indy 스레드에서 모든 작업을 수행 할 수 있습니까?

답변

2

데이터를 보내는 동안 TIdTCPServer.Contexts 목록을 잠근 상태로 유지할 수 있습니다. 컨텍스트는 목록에서 제거 될 때까지 해제되지 않습니다. 단점은 하나의 전송이 진행되는 동안 클라이언트 연결/연결 끊기/전송이 처리되지 않는다는 것입니다.

또는 try/except 블록에서 보내는 코드를 감싸고 발생할 수있는 오류는 무시하십시오.

또는 코드를 다시 작성하여 송신 대기열을 컨텍스트 자체로 옮기는 것이 가장 좋습니다. 그렇습니다. 그런 다음 OnExecute 이벤트 처리기는 큐를 주기적으로 확인하고 사용 가능한 경우 데이터를 보낼 수 있습니다. 또한 동시에 여러 클라이언트에 대해 송신 데이터를 준비 할 경우 더 이상 송신을 직렬화하지 않으므로 성능에 도움이됩니다.

+0

+1 감사합니다. OnExecute 안에 모든 통신 코드를 재구성하고 배치하는 방법에 대해 생각하고 있습니다. – jpfollenius