델파이 쓰레드 예제

TThread 클래스에는 하나의 중요한 속성이 있습니다: 종료 : 부울; 고급 Windows 프로그래밍에 대한 많은 책이 이러한 주제를 다루지만 이 책에 제공된 C 및 C++ 코드 예제를 Delphi에 매핑해야 합니다. 이 섹션에서는 이러한 많은 기능을 사용하는 예제를 제공합니다. 이 프로그램은 데이터를 저장하고 검색하기 위해 TSharedData 레코드를 사용합니다. TSharedData는 공유 파일에 포인터를 저장하는 문제를 피하기 위해 짧은 문자열을 사용합니다. 예제 4-11에서는 공유 파일을 만들고 매핑하는 방법을 보여 주며 있습니다. FPC 버전 2.0.1 이상에서 TThread.Create에는 스택 크기에 대한 암시적 매개 변수도 있습니다. 이제 필요한 경우 만든 각 스레드의 기본 스택 크기를 변경할 수 있습니다. 스레드의 심층 프로시저 호출 재귀가 좋은 예입니다. 스택 크기 매개 변수를 지정하지 않으면 기본 OS 스택 크기가 사용됩니다. 클라이언트는 이벤트를 설정하여 서버를 절전 모드 해제합니다. 이벤트는 한 프로세스가 추가 정보를 전달하지 않고 다른 프로세스에 알리는 방법입니다. 서버는 이벤트가 트리거될 때까지 대기하고 클라이언트가 파일 이름 목록을 공유 파일에 복사하면 클라이언트가 이벤트를 설정하여 서버를 절전 모드해제합니다. 예제 4-13은 이벤트를 만들기 위한 코드를 보여 주며, 이에 대한 코드를 보여 주시고 있습니다.

클래스를 작성하지 않으려면 BeginThread 및 EndThread를 사용할 수 있습니다. Win32 API 호출 CreateThread 및 ExitThread 함수에 대 한 래퍼이지만 Win32 API 대신 직접 Delphi의 함수를 사용 해야 합니다. Delphi는 프로그램에서 BeginThread를 호출하거나 TThread를 사용하여 스레드를 시작하는 경우 True인 글로벌 플래그IsMultiThread를 유지합니다. Delphi는 메모리를 할당할 때 스레드 의 안전성을 보장하기 위해 이 플래그를 확인합니다. CreateThread 함수를 직접 호출하는 경우 IsMultiThread를 True로 설정해야 합니다. PrintText 메서드는 필요에 따라 동기화된 인쇄 프로시저를 호출하여 주 인쇄 루프를 관리합니다. 스레드는 예제 4-7에서 볼 수 있듯이 동기화할 필요가 없는 부기 세부 정보를 관리합니다. 나는 그들이 완료 할 때 스레드의 제어를수신하는 TerminateThread 메서드를 만들었습니다. 다른 스레드와 다른 것은 연결 문제입니다. 모든 스레드에 새 연결을 만들어야 하며 다른 사용자와 동일한 ADOConnections를 공유할 수 없습니다.

이 예제가 도움이 되기를 바랍니다. VCL 구성 요소 또는 컨트롤에 대한 일부 참조를 보호해야 합니다. 델파이의 각 릴리스는 VCL의 스레드 안전도를 향상시키고 델파이 5에서는 대부분의 VCL이 스레드에서 안전합니다. 물론 여러 스레드에서 VCL 개체를 수정할 수 없으며 Windows GDI에 매핑하는 VCL 속성이나 메서드는 스레드로부터 안전하지 않습니다. 일반적으로 시각적 개체는 스레드에서 안전하지 않지만 무대 뒤작업은 일반적으로 안전합니다. 속성 이나 메서드가 안전한지 확실하지 않은 경우 그렇지 않다고 가정합니다. Windows GDI 함수를 호출하거나 VCL에 액세스해야 하는 경우 중요한 섹션을 사용하는 대신 더 잘 작동하는 다른 메커니즘인 TThread 클래스와 다음 섹션에서 읽을 수 있는 동기화 메서드를 제공합니다. BeginThread 및 EndThread 함수를 사용 한다고 동기화 메서드의 편의를 제공 하지 않습니다. 이러한 함수를 사용하려면 VCL에 대한 직렬화된 액세스를 준비해야 합니다.

이 것을 잊어 버리고 TThread를 사용하는 경우 시작 시이 오류가 발생합니다: 서버를 시작하려면 TServerThread 의 인스턴스를 만드십시오. 서버를 중지하려면 스레드의 종료된 플래그를 True로 설정하고 이벤트를 신호로 표시하여 스레드를 절전 모드 해제합니다. 스레드가 절전 모드 해제되고 기본 루프를 통과하며 종료된 플래그가 True이기 때문에 종료됩니다. 스레드가 제대로 정리되었는지 확인하기 위해 주 스레드는 서버 스레드가 종료될 때까지 기다리지만 오래 기다리지 않습니다.