2012-03-17 4 views
1

가 나는 TThread이이 방법 asynchron 호출 할 때, 그것은 다음 함수를 호출합니다 스레드는

//------------------------------------------------------------------------------ 
procedure TfrImageShow.Load(bmBitmap:TBitmap); 
begin 

    self.bmBitmapCopy.Width:=bmBitmap.Width; 
    self.bmBitmapCopy.Height:=bmBitmap.Height; 
    self.bmBitmapCopy.Canvas.Draw(0,0,bmBitmap); 
end; 

그리고 실행에 내 스레드

이 메소드를 호출을하고, 시간이 지나면 그 시스템 자원이 부족합니다. 이유는 비트 맵이 VCL 구성 요소가 아니기 때문입니다. 그것은 또한 중요 섹션을 사용

는 중요 섹션은 (내가 다른 스레드가없는 사실을 언급) 유용한 경우도
TThread.execute 
begin 
.... 
    csCriticalSection.Enter; 
     frImage.Load(bmBitmap); 
    csCriticalSection.Leave; 
.... 
end; 

나는 질문이 있습니다 만, 때로는 응용 프로그램 스레드는 보호

답변

0

에서 bmBitmapCopy 읽기 critical secion이있는 스레드에서 GUI (주 스레드 VCL)에 액세스하는 것이이 문제를 해결하는 올바른 방법이 아닙니다.

VCL은 다른 스레드에서 직접 액세스 할 수 없으므로 스레드가 호출을 VCL과 동기화해야합니다.

예 (델파이 버전이 anonymous methods을 지원하는 경우) :

Synchronize(
    procedure 
    begin 
     frImage.Load(bmBitmap); 
    end); 

Synchronize 방법은 실행 중에 메인 스레드로 교체됩니다.

당신이 나이가 델파이 버전이있는 경우, 거기에서로드하여 TThread 클래스에 메소드를 추가하고 전화 :

TThread.CallLoad; 
begin 
    frImage.Load(bmBitmap); 
end; 

TThread.Execute; 
begin 
    ... 
    Synchronize(Self.CallLoad); 
    ... 
end; 
critical section의 사용에 두 개 이상의 스레드에서 액세스를 직렬화하는 것입니다

공통 객체/변수 등이 있습니다. 그러나이 경우 스레드에서 VCL 리소스에 대한 호출은 엄격히 금지됩니다.

+0

동기화는 매개 변수없는 방법 만 사용합니다. – NGLN

+0

@NGLN, 익명 메소드를 사용하여 매개 변수 호출을 해결하는 예제로 답변을 업데이트했습니다. 감사. –

+1

@NGLN 및 매개 변수와 동기화하기 위해 스레드 메소드를 사용하는 또 다른 예입니다. –