여러 사람들이 쓰레드 하면 일단 겁부터 냅니다.
뭐 하긴 쓰레드라는 넘이 좀 어렵긴 합니다. 이것 저것 신경 쓸일도 많고요…
하지만, 몇가지 룰만 알면 쓰레드도 쉽게 처리가 가능합니다.
< 참고 : Thread란 무엇이냐는 쉽게 말해서 내 몸이 프로그램이고 내가 지금 책을 읽고 잇다면, 쓰레드는 책장을 넘기는 손처럼 읽고 있는 동작을 멈추지 않고 손이 따로 움직여 책장을 넘기는것 처럼 여러 작업들이 따로 따로 제각각 일을 처리할수 잇도록 하는 방법이라 볼수 있습니다.>
가장 쉬운 방법으로 쓰레드를 만들고 쓰레드를 돌리고 멈추고 종료 하는 방법에 대해 알아 보도록 하겠습니다.
일단 델파이에 정의된 TThread Class를 이용하여 쓰레드를 생성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
TSampleThread = class(TThread) private protected procedure Execute; override; public constructor Create; destructor Destroy; override; end; ... constructor TSampleThread.Create; begin // 쓰레드 생성시 시작할 내용 FreeOnTerminate := False; inherited Create( true ); end; destructor TSampleThread.Destroy; begin // 쓰레드종료시 작업 할 내용. inherited; end; procedure TSampleThread.Execute; begin while not Terminated do // 쓰레드를 종료 하기전 까지 begin // 작업 공간.. Synchronize( 화면에 뭔가 출력하기 위한 곳. ); // 작업 공간.. Application.ProcessMessages; WaitForSingleObject( handle, 대기시간 mSec ); end; end; |
가장 기본적인 방법으로 쓰레드를 정의한 내용입니다.
쓰레드는 가장 기본적으로 Create, Destory, Execute등의 3개는 거의 필수로 정의 해야 합니다.
Create는
쓰레드를 생성합니다. 여기서는 Inhertited의 Create 인자에 True를 넣어 줍니다.
인자값 True는 Thread가 생상되자마자 바로 실행되지 않게 해줍니다.
Resume문을 만나야 실행이 됩니다.
FreeOnTerminate := False; 는 Thread가 종료되면 메모리에서 해제 하지 말라는 내용입니다.
자동으로 메모리에서 해제되는 경우 위험도가 높습니다.
Excute는
Excute Procedure는 한번 실행이되면, 쓰레드는 종료 됩니다. 따라서 무한 반복 또는 While not Terninated do 처럼 사용자가 Terminate문을 사용하여 종료 하기 전까지 반복 수행해야 합니다.
Synchronize는 반드시 인자없는 procedure문을 호출해야 하며 화면에 뭔가를 출력해야 하는 경우 사용합니다.
Synchronize로 호출하는 procedure문은 반드시 최소한의 시간을 소모하도록 설계를 해야 합니다.
왜냐하면, Synchronize가 호출되면 쓰레드들은 모두 잠시 멈추고 Synchronize에서 호출한 Procedure가 끝날때까정 기둘립니다.
자 그럼.. 간단한 예제 나갑니다.
Resume 버튼을 누르면 ListBox1에 숫자를 출력하고.. Suspend버튼을 누르면 잠시 멈춥니다.
뭐 설명도 필요없고 보시면 금방 아실 만한 내용입니다.
주의점은 프로그램을 종료할때입니다. 소스나갑니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TSampleThread = class(TThread) private iCnt : Integer; FListBox: TListBox; procedure SetListBox(const Value: TListBox); protected Procedure Display; procedure Execute; override; public constructor Create; destructor Destroy; override; property ListBox : TListBox read FListBox write SetListBox; end; TForm1 = class(TForm) BTN_ThreadResume: TButton; ListBox1: TListBox; BTN_ThreadSuspend: TButton; procedure BTN_ThreadResumeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure BTN_ThreadSuspendClick(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } SampleThread : TSampleThread; end; var Form1: TForm1; implementation {$R *.dfm} { TReadThread } constructor TSampleThread.Create; begin iCnt := 0; FreeOnTerminate := False; inherited Create( true ); end; destructor TSampleThread.Destroy; begin inherited; end; procedure TSampleThread.Display; begin With ListBox do begin Items.Add( Inttostr( iCnt ) ); ItemIndex := Count - 1; end; end; procedure TSampleThread.Execute; begin while not Terminated do begin Inc( iCnt ); Synchronize( Display ); Application.ProcessMessages; WaitForSingleObject( handle, 500 ) end; end; procedure TSampleThread.SetListBox(const Value: TListBox); begin FListBox := Value; end; { Form1 } procedure TForm1.BTN_ThreadResumeClick(Sender: TObject); begin SampleThread.Resume; end; procedure TForm1.BTN_ThreadSuspendClick(Sender: TObject); begin SampleThread.Suspend; end; procedure TForm1.FormCreate(Sender: TObject); begin SampleThread := TSampleThread.Create; SampleThread.ListBox := ListBox1; end; procedure TForm1.FormDestroy(Sender: TObject); begin if SampleThread.Suspended then SampleThread.Resume; SampleThread.Terminate; SampleThread.WaitFor; SampleThread.Free; end; end. |
가장 간단한 쓰레드의 예제입니다.
이제막 쓰레드를 보시는 분들만 참고 하시기 바랍니다.
최신 댓글