/////////////// 쓰레드가 적용된 실행가능 폼을 첨부합니다.
////////////// 서버가 문제없는데 접속이 안되는것은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;
--------------------------------
|