항상 그렇지만 필자의 글은 필자의 허락없이 다른곳으로 옮기거나 수정하거나 상업적인 사용을 금합니다. 링크는 가능 합니다.
( 이유는 2009년초에 불미스러운 일로 인해 필자의 저작권을 가지고 교습 및 상업적인 이용에 관해 항의를 했으나 오히려 제가 고소를 당하는 사건으로 인해 2009년 사건이후 부터 제가 직접 쓰는 모든 글에 위 내용을 기술합니다.
퍼오거나 링크하거나 하는 남의 저작물에 대해서는 위내용을 기술하지 않습니다. )
전번에 쓰레드에 대한 기본적인 사용법을 보았습니다.
뭐 간단한 예제를 만들수는 있겠는데, 아는 후배가 부탁한 내용이라 한번 만들어 보았습니다.
만든지는 조금 되었는데, 그동안 알바로 조금 바빠서리 이제야 올리네요..
우선 쓰레드에서 Synchronize와 CriticalSection에 대해 간단한 설명을 하도록 하겠습니다.
정말 간단한 내용이므로 잘 보시지 않으면 그냥 지나치실듯 ㅎㅎㅎ
델파이 쓰레드는 Synchronize라는 함수를 이용하여 쓰레드 중에 VCL이나 기타 화면 출력 관련된 내용을 처리 할때 사용합니다.
Synchronize는 함수 인자가 없어 많이 불편합니다.
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 |
TDisplayThread = class(TThread) private ... FListBox: TListBox; ... protected procedure Display; ... public constructor Create; destructor Destroy; override; ... property ListBox : TListBox read FListBox write SetListBox; end; ... procedure TDisplayThread.Display; var I: Integer; begin With ListBox do begin Items.Add( 'sData Count = ' + IntToStr( sData.Count ) ); for I := 0 to sData.Count - 1 do begin Items.Add( sData[i] ); ItemIndex := Count -1; end; sData.Clear; end; end; |
위 예제에서 보듯이 보통은 쓰레드를 생성하고 프로퍼티에 (위에서는 ListBox라는 프로퍼티에) 출력할 VCL을 올려놓고 그위치에 출력합니다.
헌데 지난번에 도 말쓴 드렸다 시피 쓰레드에서 Syncronize을 사용하면, 쓰레드들이 멈추고 Syncronize를 실행한뒤에 처리하므로 Syncronize안에서 Application.ProcessMessage는 사용하지 않는것이 좋습니다.
그리고, 최소한의 작업으로 최대한 빠르게 출력 작업만을 처리하시면 됩니다.
이유는 느리면 느린만큼 모든 쓰레드가 느리게 동작 하기 떄문이지요.
그래서 Syncronize안에 출력할 내용이 많거나 복잡하거나 느린작업을 할때에는 Syncronize에서 처리하는대신 출력할 VCL이 위치한 Form또는 Class에 직접 Message를 보내서 메세지를 받은 Form또는 Class가 대신 출력을 하는 방법을 이용하기도합니다.(그냥 출력하는방법에 비해 메세지를 보내고 받는 시간이 즉각적이지는 않습니다 그래서 조금 느리게 동작하는 감이 있습니다.)
비슷한 내용으로 TCriticalSection사용이 있는데, 이넘역시 지난번 말씀 드린데로 전역변수 또는 특정 변수의 값을 다른 쓰레드에서 참고 하지 못하도록 할때 사용합니다.
세마포어는 다른 실행화일(Exe나 DLL)들간의 데이타 공유 처리를 위한 작업에 쓰이므로 여기서는 논하지 않습니다.
CriticalSection은 전역으로 사용하는것이 편리합니다. 그래야만 사용하고자 하는 전체 쓰레드들간에 변수 또는 메모리등의 간섭을 방지할수 있기 때문이죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
TReadThread = class(TThread) private FtCS: TCriticalSection; ... protected ... public ... property tCS : TCriticalSection read FtCS write SettCS; end; .... // 선언을 하는곳.. PB_CS := TCriticalSection.Create; ... Read_Thread := TReadThread.Create; Read_Thread.tCS := tCS; ... |
그래서 위 본문 처럼 쓰레드에 전역 으로 선언된 CriticalSection을 넣어주거나 전역으로 선언된 TCriticalSection을 사용하게 됩니다.
다음장에서는 실제 구체화된 작업을 해보도록 하겠습니다.
최신 댓글