처음 질문이 여러개의 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를 생성해 보신 분 계시면 보충 설명 부탁드립니다.
|