Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[14016] Re:저는 TCPClient하나당 쓰레드 하나 추천드립니다.
김수정 [] 2358 읽음    2011-12-31 16:38
자꾸 부담을 드려 죄송스러운데 꾸준한 도움에 진심으로 감사드립니다.



조대현.Clau 님이 쓰신 글 :
: 소켓통신의 정석이라할수 잇는데 클라이언트 하나당 쓰레드 하나로 만들면 아주 이상적입니다.
:
: 첨부파일에는 실제 테스트까지 마친 Indy TCP를 사용한 쓰레드 예제입니다.
:
: ListBox의 Items속성에 에 원하는 IP를 넣어두시면 실시간 동시 접속이 이루어집니다.
:
:
: 1. 현재 가장 큰 문제는 20개의 클라이언트를 순차적으로 생성하다보니 하나에서 락이걸려  멈춰버리면 그 뒤까지 영향이 있는거죠.
:
: 2. 그래서 쓰레드 클래스를 만들때 하나의 ip,port로 접속후 데이터를 전송하게 만듭니다.
:
: 3. 그리고 이  쓰래드를 20개 만들면 거의 실시간으로 동시접속, 데이터방송, 접속해제가 가능합니다.
:
: 4. 제가 외부라서 집에가면 완성된 소스로 도움을 드려볼게요.
:
: 5. 일단은 쓰레드에서 for문을 제거하고 하나의 ip,port 로 접속하도록 만듭니다
:
: 6. 그리고 버튼에서 쓰레드클래스를 20개 만들면 됩니다
:
: 7. 말씀하신 5~12개 생성시마다 지연시간이 발생하는것은 connection timeout이 너무짧거나
: 서버의 동시접속 능력이부족한 경우라 보이네요.
:
: 결론은 지연시간없이 20개 동시접속 데이터 전송 구현가능합니다. 서버가 능력이 된다면요.
:
:
:
: 김수정 님이 쓰신 글 :
: : 처음 질문이 여러개의 TIdTCPClient를 생성해가며 여러대의 피시에 데이터를 전송할때의 문제였습니다.
: :
: : 예를들어 timeout을 200으로 하고 20대의 피시에 데이터를 전송하기 위해
: : TIdTCPClient를 20개 생성하고
: : 각 TIdTCPClient의 IPAddr에 각 피시의 IP를 넣어주고
: : Connect;
: : WriteLn(...);
: : disconnect;
: : 이렇게 했는데요.
: :
: : 이 과정을 루프문으로 돌려보면
: : 1번쩨 부터 12번쩨 TIdTCPClient가 생성될때까지는 이상없이 잘 됩니다.
: : 하지만 13번쩨 TIdTCPClient가 생성될때 약 30초(또는 그 이상) 정도 멈춰있습니다.
: :
: : 그리고 5개정도(정확하지 않음)의 TIdTCPClient가 더 생성되고 다시 한참을 멈춰있습니다.
: : 그리고 또 5개의 TIdTCPClient가 생성되고 나서 다시 한참을 멈춰있구요.
: : ...
: : 이런 과정을 반복하며 나머지 TIdTCPClient가 생성되는데요.
: :
: : 이곳에 질문을 올리니 인디는 블로킹방식이므로 Thread를 사용하라는 조언을 받았습니다.
: :
: : 그리고 이번엔 20개의 쓰레드를 생성해서
: : 각 쓰레드 안에서 TIdTCPClient를 생성하여 데이터를 전송해 보니
: : 데이터 전송이 되지 않았습니다.
: :
: : 제 생각에는 다른 쓰레드에서 통신포트를 사용하고 있는 중에
: : 또 다른 쓰레드가 생성되고 그 안에서 통신포트를 사용하기 때문이 아닌가 생각됩니다.
: :
: : 그래서 데이터를 전송하기 전에 현제 통신포트가 사용되고 있는지를 검사하고
: : 사용중이면 대기하도록 하려 했으나
: : 아무리 자료를 찾아봐도 제 힘으로는 역부족이라 포기했는데요.
: :
: : 그렇다고 쓰레드를 생성하고 그 안에서 여러개의 TIdTCPClient를 생성하는 것은 의미가 없어보입니다.
: : 어차피 그 쓰레드에서도 12개의 TIdTCPClient가 생성되고 나면
: : 13번쩨 TIdTCPClient가 생성될때 한참을 멈출테니까요.
: :
: : 어찌 되었든
: : 한개의 어플리케이션 안에서 여러개의 TIdTCPClient를 생성하는 경우
: : 처음엔 12개, 그 이후부터는 5개(정확하지 않음) 단위로 성성되고
: : 그 사이 사이마다 무언가를 처리하는 것 같다는 결론입니다.
: :
: : 어쩌면 너무 많은 TIdTCPClient가 생성되기 때문에 메모리상에서 처리하지 못하고
: : 하드디스크상에 물리적인 케시를 하는 것 일 수도 있고
: : 어쩌면 메모리를 정리하는 것일 수도 있고....
: : 하여간 제 능력으로 원인파악을 할 수 없지만
: : 한개의 어플리케이션에서 여러개의 TIdTCPClient를 생성하여 각각의 IP로 데이터를 전송하기 위해서는
: : TIdTCPClient를 12개 단위로 Create와 Free를 해야 하는 것이 아닌가 집작할 뿐입니다.
: :
: : 혹시 여러대의 IP로 데이터를 전송하기 위해 여러개의 TIdTCPClient를 생성해 보신 분 계시면 보충 설명 부탁드립니다.

+ -

관련 글 리스트
14014 여러개의 TIdTCPClient를 생성하는 경우에 대한 지금까지의 결론입니다. 조언 부탁드립니다. 김수정 2103 2011/12/30
14015     저는 TCPClient하나당 쓰레드 하나 추천드립니다. 조대현.Clau 4130 2011/12/30
14016         Re:저는 TCPClient하나당 쓰레드 하나 추천드립니다. 김수정 2358 2011/12/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.