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
[14013] Re:IdTCPClient에 쓰레드 적용. 도움이 되시길...
김수정 [] 2244 읽음    2011-12-30 11:39
조대현님 감사합니다.
답답해서 질문을 하긴 했지만 사실 이렇게 귀찮은 답변을 누가 할까? 생각하고 있었는데 감사하게도 이렇게 자세한 답변을 주셧네요.
다시 한 번 진심으로 감사드립니다.

조대현.Clau 님이 쓰신 글 :
: /////////////// 쓰레드가 적용된 실행가능 폼을 첨부합니다.
: ////////////// 서버가 문제없는데 접속이 안되는것은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로 데이터를 보내는데요. 김수정 1798 2011/12/28
14009     Re:IdTCPClient에서 여러대의 IdTCPServer로 데이터를 보내는데요. kylix 2858 2011/12/28
14011         Re:Re:IdTCPClient에서 여러대의 IdTCPServer로 데이터를 보내는데요. 김수정 3334 2011/12/29
14012             IdTCPClient에 쓰레드 적용. 도움이 되시길... 조대현.Clau 3993 2011/12/30
14013                 Re:IdTCPClient에 쓰레드 적용. 도움이 되시길... 김수정 2244 2011/12/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.