我有一个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资源。