2012-03-17 1 views
1

asynchron呼び出したときに、私は、システムリソースの不足受けるなぜのTThreadを持っており、それは次の関数呼び出し:スレッドがこのメソッド

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

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

をし、実行中の私のスレッドは、このメソッドを呼び出し、そして時間のそれの後エラー:システムリソースが不足していますか?なぜなら、BitmapはVCLコンポーネントではないからです。また、そのクリティカルセクションが便利である場合にも、私は疑問を持っている(私は他のスレッドが存在しないことを言及)、のみときどきアプリケーションスレッドが

保護

答えて

0

からbmBitmapCopyを読んでクリティカルセクションに

TThread.execute 
begin 
.... 
    csCriticalSection.Enter; 
     frImage.Load(bmBitmap); 
    csCriticalSection.Leave; 
.... 
end; 

を使用しますcritical secionのスレッドからGUI(メインスレッドVCL)にアクセスすることは、これを処理する正しい方法ではありません。

VCLは他のスレッドから直接アクセスできないため、呼び出しをVCLに同期させる必要があります。 Synchronize方法は、実行時にメインスレッドにスワップする

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

:(あなたのDelphiのバージョンはanonymous methodsをサポートしている場合)

例。古いDelphiのバージョンを持っている場合は、あなたのTThreadクラスにメソッドを追加して、そこからロードを呼び出す

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

TThread.Execute; 
begin 
    ... 
    Synchronize(Self.CallLoad); 
    ... 
end; 

critical sectionの使用は、2つ(またはそれ以上)からのアクセスをシリアル化することで、スレッドへ共通のオブジェクト/変数などです。しかし、この場合、スレッドからVCLリソースへの呼び出しは厳密に禁止されています。

+0

同期化は、パラメータのないメソッドのみを使用します。 – NGLN

+0

@ NGLNは、匿名メソッドを使用してパラメータ呼び出しを解決する例で答えを更新しました。ありがとう。 –

+1

@NGLN、およびパラメータと同期させるためにスレッドメソッドを使用する別の例です。 –

関連する問題