能否使用共有的TPicture在两个线程中同时进行画图?(200分)

  • 主题发起人 主题发起人 tempc
  • 开始时间 开始时间
T

tempc

Unregistered / Unconfirmed
GUEST, unregistred user!
程序如下;
var
Picture: TPicture; // 全局变量, 在主程序开始执行时初始化。

procedure TThread1.Execute() //线程1的执行函数
var
Bitmap: TBitmap;
begin
Bitmap.Draw(0, 0, Picture.Graphic); 将Picture中的图像画到位图上
end;

procedure TThread2.Execute() //线程2的执行函数
var
Bitmap: TBitmap;
begin
Bitmap.Draw(0, 0, Picture.Graphic); 将Picture中的图像画到位图上
end;

当两个线程同步运行时,会不会产生问题?应该如何解决?
 
to pengyt:
我贴上来的代码里漏掉了对局部变量Bitmap的初始化,即:
Bitmap:=TBitmap.Create;
Bitmap.Width:=Picture.Graphic.Width;
Bitmap.Height:=Picture.Graphic.Height;
谢谢你帮我补上。但是既然Bitmap是局部变量,就不会出现多个线程共享这个Bitmap对象的
问题,为什么还需要调用Bitmap.Canvas.Lock和Bitmap.Canvas.Unlock呢?
 
VCL不是线程安全的,如果不这样做的话,
经常会出现 'out of resource' 的错误
如果有其他的方法可以将Picture中的图转移到
Bitmap中,比如用assign(),就尽量不要用TCanvas
的方法
 
另,刚才我是直接COPY你的文字
Bitmap.Draw(0, 0, Picture.Graphic);

应该是
Bitmap.Canvas.Draw(0, 0, Picture.Graphic)
 
var
Picture: TPicture; // 全局变量, 在主程序开始执行时初始化。

procedure TThread1.Execute() //线程1的执行函数
var
Bitmap: TBitmap;
begin
Bitmap:=TBitmap.Create;
Bitmap.Width:=Picture.Graphic.Width;
Bitmap.Height:=Picture.Graphic.Height;
Bitmap.Canvas.Lock;
Bitmap.Canvas.Draw(0, 0, Picture.Graphic); 将Picture中的图像画到位图上
Bitmap.Canvas.UnLock;
end;

procedure TThread2.Execute() //线程2的执行函数
var
Bitmap: TBitmap;
begin
Bitmap:=TBitmap.Create;
Bitmap.Width:=Picture.Graphic.Width;
Bitmap.Height:=Picture.Graphic.Height;
Bitmap.Canvas.Lock;
Bitmap.Canvas.Draw(0, 0, Picture.Graphic); 将Picture中的图像画到位图上
Bitmap.Canvas.UnLock;
end;
 
局部变量Bitmap可以不LOCK,因为只会有一个线程访问它;
全局变量Picture应该LOCK,因为会有多个线程同时访问它。

如果Picture没有LOCK方法,你可以自己创建全局互斥令牌实现。
(CreateMutex, OpenMutex, ReleaseMutex)。
仅供参考。
 
多人接受答案了。
 
后退
顶部