DELPHI에서의 멀티스레드 프로그래밍 (1)
우리는 win95나 winNT가 둘 다 "멀티 스레드" 운영 체제라는 것을 알고 있습니다. DELPHI 2.0에서는 이 기능을 최대한 활용하고 "멀티 스레드" 애플리케이션을 작성할 수 있습니다.
과거 DOS나 16비트 윈도우에서 프로그램을 작성했던 이들에게는 '멀티스레딩'이 아직 낯설지만, DOS의 단일 작업에서 Windows 3.1의 멀티태스킹으로 전환한 것처럼 이제는 다시 전환을 해야 합니다. 결국 "멀티스레딩" 분야에 있어서 컴퓨터 시대는 끊임없이 발전하고 있습니다. 그러나 다행스럽게도 DELPHI2.0의 멀티스레드 프로그래밍에서는 작업을 완료하기 위해 DELPHI의 표준 멀티스레드 클래스 TThread를 사용할 수 있습니다.
TThread는 추상 클래스입니다. 즉, TThread를 기반으로 변수를 선언할 필요가 없습니다(그리고 TThread를 기반으로 선언된 변수는 완전히 쓸모가 없습니다). 우리가 해야 할 일은 TThread를 기본 클래스로 사용하고 이를 생성하는 것입니다. 상속의 형태. 실제로 TThread를 기반으로 하는 멀티스레드 애플리케이션을 작성하는 것은 매우 쉽습니다.
다음은 TThread를 상속받아 생성된 기본 멀티스레드 클래스이다.
QuerThrd. 우선권
unitQuerThrd;
인터페이스
용도
클래스,DBTables;
유형
TQueryThreadΚclass(TThread)
사적인
fQuery:tQuery;
보호됨
절차실행;재정의;
공공의
constructorCreate(일시 중단: Boolean; 쿼리: TQuery);
끝;
구현
건설자
TQueryThread. Create(일시 중단: 부울; 쿼리: TQuery);
시작하다
상속받은Create(일시중단);
fQuery: Κ쿼리;
FreeOnTerminate:ΚTrue;
끝;
절차TQueryThread. 실행하다;
시작하다
f쿼리. 열려 있는;
끝;
끝.
위의 간단한 예에서는 백그라운드에서 데이터베이스 쿼리를 실행하기 위해 TThread의 TQuery-Thread 하위 클래스를 구성했습니다. 이 클래스의 Create 함수에는 Suspended와 Query라는 두 매개변수가 전달되는데, 여기서 Suspended는 스레드 실행을 제어하는 데 사용됩니다. Suspend가 true인 경우 TQueryThread 클래스의 스레드는 Resume이 설정된 후 즉시 일시 중단됩니다. 메소드가 실행되면 스레드는 계속 실행됩니다. Query 매개변수는 다중 스레드 상황에서 실행되도록 기존 쿼리 제어(양식의 실제 쿼리 제어)를 승인하는 데 사용됩니다. Execute는 TQueryThread 클래스의 실행 부분 중 가장 중요한 프로세스입니다. 이 멀티 스레드 클래스에서 실행해야 하는 모든 문은 이 프로세스에서 작성되어야 합니다.
실제로 자신만의 멀티 스레드 클래스를 구성할 때 이러한 코드를 모두 입력할 필요는 없습니다. DELPHI의 파일 메뉴에서 새 옵션을 선택한 다음 "TThreadObject" 프로젝트를 선택하면 DELPHI가 기본 프로그램 모듈을 구성합니다. 그런 다음 필요에 따라 해당 수정 작업을 수행할 수 있습니다.
프로세스 실행:
사용할 쿼리 컨트롤 Query1이 포함된 FORM1 양식을 생성했다고 가정합니다. 그런 다음 위에서 작성한 QuerThrd 유닛을 해당 유닛의 USES 부분에 추가합니다.
절차TForm1. Button1Click(보내는 사람: TObject);
시작하다
{실행 중인 프로세스 생성}
TQueryThread. 생성(False,쿼리1);
끝;
이 프로세스가 실행되면 양식의 쿼리 컨트롤 Query1이 자동으로 멀티 스레드 환경에서 쿼리를 실행합니다. TQueryThread 클래스에는 Create만 있고 Free는 없습니다. 클래스를 동적으로 생성한 후 삭제하는 것을 잊어버린 경우는 FreeOnTerminate(실행 후 삭제)를 true로 지정했기 때문에 흔히 저지르는 실수 중 하나입니다. 여기서 Execute의 문이 실행되면 완료 후 TQueryThread 클래스가 차지했던 메모리 제어가 자동으로 해제됩니다.
그러나 주목할 만한 또 다른 문제가 있습니다. 여러 스레드가 동시에 실행될 수 있으므로 여러 멀티 스레드 프로그램 간에 상관 관계가 없으면 그들 사이에도 상관 관계가 없습니다. 어떤 갈등. 그러나 실제로는 여러 개의 다중 스레드 데이터베이스 응용 프로그램이 동시에 실행될 수 있습니다. 동일한 데이터베이스 리소스를 공유해야 하므로 Query1에 Tsession 컨트롤도 추가해야 합니다.
실제로 Session 컨트롤을 개인적으로 사용하지는 않았지만 실제로 DELPHI는 모든 데이터베이스 액세스 중에 임시 Session 컨트롤을 자동으로 생성하고 사용 후 동적으로 삭제합니다. 일반적인 데이터베이스 프로그래밍에서는 이를 직접 수행할 필요가 없지만 데이터베이스의 다중 스레드 실행의 경우 서로 충돌하지 않도록 각 데이터베이스 액세스에 대해 고유한 세션 제어를 사용자 정의해야 합니다. 이 단계는 매우 간단합니다. 양식에 세션 컨트롤을 추가한 다음 해당 속성 "Sessionname"에 임의의 이름을 쓴 다음 Query1의 "Sessionname"에 동일한 이름을 쓰면 됩니다. 이렇게 하면 우리 데이터베이스 프로그램이 안전해집니다.
해결해야 할 또 다른 유형의 동기화 문제는 VCL 리소스에서 작동하는 프로그램입니다. 이러한 프로그램은 많지만 다행히도 해결 방법도 매우 간단합니다.
우리는 다음과 같은 프로그램을 볼 수 있습니다:
단위BncThrd;
인터페이스
용도
WinProcs, 클래스, 그래픽, ExtCtrls;
유형
TBounceThreadΚclass(TThread)
사적인
FShape: TShape;
FXSpeed: 정수;
FYSpeed: 정수;
절차MoveShape;
보호됨
절차실행;재정의;
공공의
constructorCreate(일시 중단: 부울; 모양: TShape; XSpeed, YSpeed: 정수);
propertyShape: TShapereadFShape;
끝;
구현
절차TBoad. 모양 이동;
var
MaxHeight, MaxWidth: 정수;
시작하다
FShapedo와 함께
시작하다
왼쪽: ΚLeft+FXSpeed;
상단: ΚTop+FYSpeed;
if(왼쪽Ι0) 또는
(왼쪽+너비Λ부모.너비)그런 다음
FXSpeed: ΚFXSpeed*-1;
만약(TopΙ0) 또는
(상단+높이Λ상부.높이)그런 다음
FYSpeed: ΚFYSpeed*-1;
작성자 블로그: http://blog.csdn.net/zou5655/