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