TCP Client가 연결하는데 서버가 응답하지 않으면 클라이언트는 ConnectTimeout될때까지 대기하고 있죠. 인디는 블로킹방식이기 때문에 대기중에는 그 다음행이 실행이 안됩니다.
배열이건 리스트건 데이터구조하고는 상관이 없습니다.
smooth하게 처리하실려면 timeout을 줄이거나 쓰레드로 처리하세요.
timeout이 코딩하고 질문하고 다르군요. 아마도 인디 9버전 쓰시는것 같은데 9버전의 최신판으로 업그레이드하세요. ConnectTimeout이 제대로 안 먹는것은 예전버전의 버그입니다.
김수정 님이 쓰신 글 :
: 아래 소스코드를 봐주세요.
:
: ....
: VAR
: Clien : Array of TIdTCPClient;
: ....
: ....
:
: procedure TForm1.FormCreate(Sender: TObject);
: var
: IPAddr : String;
: i : Integer;
: Begin
: .....
: .....
: for I := 0 to ListBox1.Count - 1 do
: Begin
: IPAddr := ListBox1.Items.Strings[i];
:
: Client[i] := TIdTCPClient.Create(Application);
: Client[i].ConnectTimeout := 200;
: Client[i].IPVersion := Id_IPv4;
: Client[i].Port := 97;
: Client[i].Host := IPAddr;
: TRY
: Client[i].Connect;
: Except
: Memo1.Lines.add('Connect Error : ' + IPAddr);
: END;
: End;
: End;
:
:
: 폼이 생성될때 클라이언트를 만들어 넣어주고 connect하는데요.
:
: 10개 이상의 클라이언트를 생성하려 하면 문제가 생깁니다.
: 처음엔 10개의 TIdTCPClient가 생성되고 30초 동안 아무것도 안움직이고 멈춰있습니다.
: 그 다음 부터는 5개가 생성된 다음 30초씩을 기다려야 추가로 또 5개씩 생성됩니다.
:
: 그뿐이 아니예요.
: 간혹 서버는 문제가 없는데 Connect가 안되는 경우가 불규칙하게 발생합니다.
:
: TIdTCPClient를 배열로 하지 않고 TObjectList 또는 TComponentList에 넣어서 해봐도 마찬가지입니다.
: 이 문제를 해결할 수 있는 방법을 알려주시면 감사하겠습니다.
|