2014-07-14 5 views
2

일시 중지 된 속성이 true로 설정되어 있어도 스레드 클래스가 자동으로 시작됩니다. 스레드 클래스의 배열로 기본 클래스가 있습니다. 다음은 클래스 선언입니다.스레드 자동 시작

Type 

cSolution = Class(TThread) 
Private 
procedure FindLocalMinimum; 
procedure AddWorker; 
procedure RandomSortCompressors; 
procedure FindBestNetwork; 

Public 
Network : cNetwork; 
Workers : array of cWorker; 
Compressors : array of cCompressorData; 
IsAllWorkersDone : boolean; 
ID : integer; 

Procedure CreateWorkers; 
Constructor Create; overload; // This constructor uses defaults 
Constructor Create(aNetwork : cNetwork; aCompressors : array of cCompressorData); overload; // Copy constructor 
Destructor Destroy; override; //Destructor 

procedure Execute; override; 
end; 

implementation 
/// <summary>Default constructer 
/// </summary> 
constructor cSolution.Create; 
begin 
    inherited; 
    IsAllWorkersDone := false; 
    Suspended := true; 
    ID := 99; 
end; 

나는 execute 함수를 호출하는 곳과 execute 함수의 시작 부분에 중단 점을 추가했습니다. 내가 그것을 부르는 장소는 결코 발동되지 않는다. 그러나 실행 함수 자체의 중단 점이 트리거됩니다. 트리거되면 일시 중단 된 속성은 false입니다.

자동 시작을 원치 않을 때 누락 된 항목이 있거나 스레드가 자동으로 시작되는 이유가 있습니까?

+0

이 힌트 (델파이는 그 지역 ... 버그의 몇 가지가 있습니다) 공개. 공개적으로 만드는 것은 다른 코드가 직접 호출 할 수 있으므로 위험하므로 예기치 않은 "영향"이 발생할 수 있습니다. – mjn

답변

1

생성자에서 inherited Create(True)으로 전화해야합니다. 이렇게하면 스레드가 시작되지 않습니다. `Execute` 보호 된 방법으로를 오버라이드 (override) 할 필요가 승진하지 : 여전히 스레드를 시작 발생합니다 inherited Create()를 호출 한 후 TrueSuspended 설정

+1

Suspended : = True ... 또는 Suspended : = true가 이전에 실행될 수 있다는 의미입니까? – Rob

+0

감사합니다. 일시 중단 된 속성을 true로 설정하는 것은 create (true)를 호출하는 것과 동일하지만 – blackwolfsa

+0

여기에는 "Delphi bug"가 없습니다. 이 문제는 생성자를 잘못 호출하여 기본 (일시 중단되지 않은) 상태로 스레드를 만듭니다. 스레드는'Suspended : = True; '가 호출되기 전에 이미 (정확하게) 실행 중일 것입니다. (자신의 코드에서 잘못 수행 한 것으로 인한 "버그"에 대해 델파이를 비난 할 수는 없습니다.) –