조대현님 감사합니다.
답답해서 질문을 하긴 했지만 사실 이렇게 귀찮은 답변을 누가 할까? 생각하고 있었는데 감사하게도 이렇게 자세한 답변을 주셧네요.
다시 한 번 진심으로 감사드립니다.
조대현.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;
: --------------------------------
|