当线程调用异步此方法时,为什么我收到Out of system resources

时间:2012-03-17 12:13:05

标签: multithreading delphi asynchronous bitmap

我有一个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;

我在Execution中的线程调用了这个方法,过了一段时间它就会出错:系统资源不足?为什么因为Bitmap不是VCL组件。它也使用临界区

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

此外,我有一个问题,如果该关键部分是有用的(我提到你没有任何其他线程),只有时候应用程序线程从

读取bmBitmapCopy

1 个答案:

答案 0 :(得分:0)

保护对具有critical secion的线程的GUI(主线程VCL)的访问不是处理此问题的正确方法。

由于VCL不能直接从其他线程访问,因此线程必须将调用同步到VCL。

示例(如果您的Delphi版本支持anonymous methods):

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

Synchronize方法将在执行期间交换到主线程。

如果你有一个较旧的Delphi版本,请在TThread类中添加一个方法,然后从那里调用Load:

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

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

使用critical section是将两个(或多个)线程的访问序列化为公共对象/变量等。但在这种情况下,严禁从线程调用VCL资源。