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
[14012] IdTCPClient에 쓰레드 적용. 도움이 되시길...
조대현.Clau [casanebula] 3993 읽음    2011-12-30 01:33
/////////////// 쓰레드가 적용된 실행가능 폼을 첨부합니다.
////////////// 서버가 문제없는데 접속이 안되는것은ConnectTime이 너무 짧아서 그럴수있습니다. 1000ms까지 늘려보세요.

1. 쓰레드

쓰레드는 Execute라는 기본적인 프로시저가 있습니다.

이 Execute 프로시저에 들어있는 소스는 프로그램이 얼지않고 별도로 잘 돌아갑니다.



----------예를 들면--------------
procedure TForm1.Button1OnClick(Sender: TObject);
begin
  Sleep(5000);
end;
--------------------------------
버튼을 누르면 프로그램이 5초간 멈춥니다.

하지만 쓰레드에 넣어놓으면 버튼을 눌러도 멈추지 않습니다. 이동/크기조절/다른 버튼 클릭 모두 다 정상입니다.

즉, 쓰레드는 메인프로그램과 별도로 작동되어집니다.



쓰레드는 상속받아 나만의 클래스를 하나 만들고 생성해서 사용하면 됩니다.

원래는 동적생성하면 나중에 Free로 파괴해야 하지만 FreeOnTerminate를 True하면 자동파괴까지 하므로 메모리리크 걱정이 없습니다.



----------쓰레드 적용 예--------------
  TThreadTest = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TThreadTest.Execute;
begin
  inherited;
  FreeOnTerminate := True; // True로하면 버튼클릭에서 동적생성 되었지만 이 프로시저가 끝나면 자동해제까지됩니다.
  Sleep(5000);
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
  TThreadTest.Create(False); // True로하면 쓰레드가 작동하지 않습니다.
end;
--------------------------------
Sleep(5000)에 해당하는 부분에 원하시는 작업을 넣으시면 끝입니다.
단, VCL(TEdit, TList등의 모든 컴포넌트)은 대부분 사용할 수 없습니다.
복잡한 이유가 있지만 사용하면 멈춥니다. 일단 Indy같은 Design요소가 없는것은 작동합니다.




2. 필요하신 IdTCPClient 쓰레드 적용
----------IdTCPClient  쓰레드 적용 예--------------
  TThreadTest = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TThreadTest.Execute;
var
  Client : Array of TIdTCPClient;
  IPAddr : String;
  i : Integer;
begin
   inherited;
  FreeOnTerminate := True; // True로하면 버튼클릭에서 동적생성 되었지만 이 프로시저가 끝나면 자동해제까지됩니

   // 쓰레드에서도 이렇게 엑세스(읽기)는 대부분 가능합니다.
   for I := 0 to Form5.ListBox1.Count - 1 do
   Begin
        IPAddr := Form5.ListBox1.Items.Strings[i];

        Client[i] := TIdTCPClient.Create(nil); // nil로해도 됩니다.
        Client[i].ConnectTimeout := 200;
        Client[i].IPVersion := Id_IPv4;
        Client[i].Port := 97;
        Client[i].Host := IPAddr;
        TRY
             Client[i].Connect;
             Client[i].IOHandler.WriteLn('Hellow?');
             Client[i].Disconnect;
        Except
            // 이 라인은 쓰레드에서 작동할 수 없습니다. 컴포넌트가 변경되어 UI가 바뀌는 부분이므로 오류가 납니다.
            //Form5.Memo1.Lines.add('Error : ' + IPAddr);
        END;
   End;
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
  TThreadTest.Create(False); // True로하면 쓰레드가 작동하지 않습니다.
end;
--------------------------------

+ -

관련 글 리스트
14008 IdTCPClient에서 여러대의 IdTCPServer로 데이터를 보내는데요. 김수정 1799 2011/12/28
14009     Re:IdTCPClient에서 여러대의 IdTCPServer로 데이터를 보내는데요. kylix 2859 2011/12/28
14011         Re:Re:IdTCPClient에서 여러대의 IdTCPServer로 데이터를 보내는데요. 김수정 3335 2011/12/29
14012             IdTCPClient에 쓰레드 적용. 도움이 되시길... 조대현.Clau 3993 2011/12/30
14013                 Re:IdTCPClient에 쓰레드 적용. 도움이 되시길... 김수정 2245 2011/12/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.