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
[14273] indy 10에서 클라이언트 사용시 버퍼가 공유되는 문제가 발생합니다.
힐포크 [hillfolk] 2127 읽음    2012-05-15 11:42
인디 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과 같은 메소드로 데이터를 받아 들일때 데이터의 양이 너무 길어서 뻣어 버리는 증상이 발생해서요
부득이 하게 버퍼의 크기를 읽어서 읽어 들이는 형태로 진행 했습니다.


ㅠㅠ 이 문제 해결하기가 너무 힘드네요.

+ -

관련 글 리스트
14273 indy 10에서 클라이언트 사용시 버퍼가 공유되는 문제가 발생합니다. 힐포크 2127 2012/05/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.