인디 10 을 사용중입니다. 근대 여러개의 서버에서 데이터를 받아 올때 클라이언트를 여러개 생성해서 데이터를 받아오려고 했지만 한개의 클라이언트가 다 받아와 버리네요 연결은 각자하는데 어떻게 받아 올수 있는건지 --;; 약간 황당 합니다.
혹시 제가 잘못 개발 했거나 이것에 대한 해결책을 알려 주시거나 힌트라도 주시면 감사하겠습니다.
코드를 설명 드릴께요 .
여러개의 서버에서 데이터를 받아오는 프로그램인데요
ClientArray[index] := Client.Create(self);
ClientArray[index].TableNo := InfoArray[index].eNo;
ClientArray[index].TableIp := InfoArray[index].Ip;
Memo1.Lines.Add(ClientArray[index].Ip);
위에서 처럼 여러개의 폼을 생성해서 그안에서 독립된 쓰레드를 만들어서 돌리고 있습니다.
아래와 같은 쓰레드를 만들어서 돌리고 있어요 ..
TClient = class(TThread)
private
FClient: TIdTCPClient;
Line: string;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
procedure Connect(const AHost: String; const APort: integer);
procedure HandleInput;
procedure Disconnect;
end;
쓰레드 생성 부분은 아래와 갔구요.
ReadThread := TClient.Create();
ReadThread.Connect(TableIp, TablePort);
데이터를 읽어 들이는 부분 이고요 실제로 실행되는 부분은 아래와 같습니다.
procedure TClient.Execute;
var
len: integer;
begin
while (not Terminated) do
begin
if not FClient.Connected then
begin
Terminate;
Exit;
end
else
try
if Not FClient.IOHandler.InputBufferIsEmpty then
begin
len := FClient.IOHandler.InputBuffer.Capacity;
uMainForm.Memo1.Lines.Add(IntToStr(len));
if (len > 0) then
begin
Line := FClient.IOHandler.ReadString(len);
Synchronize(HandleInput);
end;
end;
except // exception 'Not Connected' raises when I want to Free TClient
on E: Exception do
ShowMessage(E.Message);
end;
end;
end;
위처럼 한 이유는 ReadLn과 같은 메소드로 데이터를 받아 들일때 데이터의 양이 너무 길어서 뻣어 버리는 증상이 발생해서요
부득이 하게 버퍼의 크기를 읽어서 읽어 들이는 형태로 진행 했습니다.
ㅠㅠ 이 문제 해결하기가 너무 힘드네요.
|