Programming/Delphi

Thread 정리 2

통통만두 2010. 6. 30. 15:28
반응형

스레드 초기화


새 스레드 클래스의 초기화 코드를 작성하려면 Create 메소드를 오버라이드해야 합니
다. 스레드 클래스의 선언에 새 생성자를 추가하고 선언을 구현하는 초기화 코드를 작성
합니다. 여기서 스레드의 기본 우선 순위를 할당하고 스레드가 실행 종료될 때 자동으로
해제되어야 할지 여부를 나타낼 수 있습니다.
기본 우선 순위 할당
우선 순위는 운영 체제가 애플리케이션의 모든 스레드 중에서 CPU 시간의 일정을 정할
때 스레드가 갖는 기본 설정 수를 나타냅니다. 시간적으로 중요한 작업을 처리할 때에는

높은 우선 순위의 스레드를 사용하고 다른 작업을 수행할 때에는 낮은 우선 순위의 스레
드를 사용합니다. 스레드 객체의 우선 순위를 나타내려면 Priority 속성을 설정하십시
오.

 

스레드 우선 순위

 

tpIdle   - 이 스레드는 시스템이 유휴 상태일 때에만 실행됩니다. Windows는 tpIdle 속성을 가진 스레드를 실행할 때 다른 스레드를 방해하지 않습니다.
tpLowest   - 이 스레드의 우선 순위는 정상보다 2포인트 아래입니다.
tpLower - 이 스레드의 우선 순위는 정상보다 1포인트 아래입니다.
tpNormal - 이 스레드는 정상 우선 순위를 가집니다.
tpHigher - 이 스레드의 우선 순위는 정상보다 1포인트 위입니다.
tpHighest  - 이 스레드의 우선 순위는 정상보다 2포인트 위입니다.
tpTimeCritical  - 이 스레드는 가장 높은 우선 순위를 가집니다.

 

경고 CPU를 많이 사용하는 작업의 스레드 우선 순위를 높이면 애플리케이션의 다른 스레드
를 사용하지 못하는 "기아" 상태가 될 수 있습니다. 외부 이벤트를 기다리는 데 대부분
의 시간을 소비하는 스레드에만 높은 우선 순위를 적용합니다.

//=========================================================================================

 

스레드 해제 시기 표시


일반적으로 스레드가 작업을 마치면 간단히 해제됩니다. 이러한 경우 스레드 객체가 스스
로 해제되도록 하는 것이 가장 쉽습니다. 스스로 해제되게 하려면 FreeOnTerminate
성을 True로 설정합니다.
그러나 하나의 스레드 종료 시기를 다른 스레드 종료 시기와 일치시켜야 하는 경우가 있
습니다. 예를 들어, 다른 스레드에서 동작을 수행하기 전에 값을 반환할 스레드를 기다
릴 경우가 있습니다. 이렇게 두 개의 스레드 종료 작업을 일치시키기 위해 두 번째 스레
드가 반환 값을 받은 다음 첫 번째 스레드를 해제하려고 합니다. 이러한 상황에서는
FreeOnTerminate를 False로 설정한 다음 두 번째 스레드에서 첫 번째 스레드를 명시
적으로 해제함으로써 처리할 수 있습니다.

 

//========================================================================================

 

스레드 함수 작성


Execute 메소드가 스레드 함수입니다. 동일한 프로세스 공간을 공유하는 것을 제외하
고는 스레드 함수가 애플리케이션에 의해 실행되는 프로그램으로 생각할 수 있습니다.
스레드 함수를 작성하는 것은 애플리케이션에서 다른 스레드에 의해 사용되는 메모리
를 겹쳐 쓰지 않아야 하므로 별도의 프로그램을 작성하는 것보다 다소 까다롭습니다. 반
면에 스레드가 다른 스레드와 동일한 프로세스 공간을 공유하므로 공유 메모리를 사용
하여 스레드 간에 통신할 수 있습니다.

 

메인 VCL/CLX 스레드 사용


VCL이나 CLX 객체 계층에서 객체를 사용할 때 해당 속성과 메소드는 스레드에 대한
안전을 보장받지 못합니다. 즉, 속성에 액세스하거나 메소드를 실행하면 다른 스레드 동
작에서 보호되지 않는 메모리를 사용하는 일부 동작을 수행할 수 있습니다. 이러한 이유
에서 VCL과 CLX 객체에 액세스하기 위해 메인 스레드를 별도로 둡니다. 이 스레드가
바로 사용자 애플리케이션의 컴포넌트에서 받는 모든 Windows 메시지를 처리하는 스
레드입니다.
모든 객체가 단일 스레드에서 해당 속성에 액세스하고 메소드를 실행할 경우에는 사용
자의 객체들이 서로 방해하는 것을 걱정하지 않아도 됩니다. 메인 스레드를 사용하려면
필요한 동작을 수행하는 별도의 루틴을 만드십시오. 스레드의 Synchronize 메소드 내
에서 별도의 루틴을 호출합니다.

Synchronize는 메인 스레드가 메시지 루프로 들어올 때까지 기다린 다음 전달된 메소드
를 실행합니다.

 

참고 Synchronize는 메시지 루프를 사용하므로 콘솔 애플리케이션에서는 작동하지 않습니
다. 콘솔 애플리케이션에서 VCL이나 CLX 객체에 대한 액세스를 보호하려면 임계 구역
과 같은 다른 메커니즘을 사용해야 합니다.
항상 메인 스레드를 사용할 필요는 없습니다. 일부 객체에는 threadaware 기능이 있
습니다. 객체의 메소드가 스레드에 대해 안전하다는 것을 알고 Synchronize 메소드를
사용하지 않으면 VCL이나 CLX 스레드가 메시지 루프로 들어올 때까지 기다릴 필요가
없으므로 성능이 향상됩니다. 다음과 같은 상황에서는 Synchronize 메소드를 사용할
필요가 없습니다.
• 데이터 액세스 컴포넌트가 다음과 같이 스레드에 대해 안전한 경우, 즉 BDE 활성 데
이터셋인 경우, 각각의 스레드는 해당 데이터베이스 세션 컴포넌트를 가져야 합니다.

이 때 스레드에 대해 안전하지 않은 Microsoft 라이브러리를 사용하여 구축한
Access 드라이버를 사용하는 경우는 예외입니다. dbDirect의 경우, 타사의 클라이언
트 라이브러리가 스레드에 대해 안전하면 dbDirect 컴포넌트는 스레드에 대해 안전
합니다. ADO와 InterbaseExpress 컴포넌트는 스레드에 대해 안전합니다.
데이터 액세스 컴포넌트를 사용할 때 Synchronize 메소드의 dataaware 컨트롤을
포함하는 모든 호출을 연결해야 합니다. 그러므로 예를 들어 데이터 소스 객체의
DataSet 속성을 설정하여 데이터셋에 데이터 컨트롤을 연결하는 호출을 동기화해야
하지만 동기화하여 데이터셋 필드의 데이터에 액세스할 필요는 없습니다.
BDE 사용이 가능한 애플리케이션에서 스레드와 함께 데이터베이스 세션을 사용하
는 데 대한 자세한 내용은 20-29 페이지의 "다중 세션 관리"를 참조하십시오.
• VisualCLX 객체가 스레드에 대해 안전하지 않은 경우.
• DataCLX 객체가 스레드에 대해 안전한 경우.
• 그래픽 객체가 스레드에 대해 안전한 경우. TFont, TPen, TBrush, TBitmap, TMetafile
(VCL 전용), TDrawing (CLX 전용) 또는 TIcon에 액세스하기 위해 메인 VCL이나 CLX
스레드를 사용할 필요는 없습니다. 캔버스 객체는 TFont, TPen, TBrush, TBitmap,
TDrawing, TIcon 등을 잠금으로써 Synchronize 메소드 외부에서 사용할 수 있습니다
(9-7 페이지의 "객체 잠금" 참조).
• 목록 객체가 스레드에 대해 안전하지 않지만 TList 대신 스레드에 대해 안전한 버전
인 TThreadList를 사용할 수 있는 경우.
백그라운드 스레드가 자신의 실행을 메인 스레드와 동기화할 수 있도록 애플리케이션
의 메인 스레드 내에서 CheckSynchronize 루틴을 정기적으로 호출하십시오. Check
Synchronize를 호출할 최적의 조건은 OnIdle 이벤트 핸들러에서 애플리케이션이 유휴
상태일 때입니다. 이렇게 하면 백그라운드 스레드에서 메소드를 호출하는 것이 안전합
니다.

반응형

'Programming > Delphi' 카테고리의 다른 글

FizzBuzz Question  (0) 2010.06.30
3DES 암/복호  (0) 2010.06.30
Thread 정리  (0) 2010.06.30
[팁] 쓸만한 함수 2  (0) 2010.06.30
[팁] 쓸만한 함수  (0) 2010.06.30