为什么当线程异步调用此方法时,我会收到系统外资源



我有一个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中的线程调用了这个方法,一段时间后它给出了一个错误:系统资源不足?为什么,因为位图不是VCL组件。它还使用关键部分

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

此外,我还有一个问题,如果关键部分是有用的(我告诉你,没有任何其他线程),只是有时应用程序线程从读取bmBitmapCopy

保护使用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资源。

最新更新