Canvas是线程安全的吗?(50分)

  • 主题发起人 主题发起人 LuckyJackie
  • 开始时间 开始时间
L

LuckyJackie

Unregistered / Unconfirmed
GUEST, unregistred user!
关于Delphi中自带的多线程排序实例,我试过如果把Synchronize去掉,就会出错,但好像有一种说法只要使用Lock,Unlock就可以保证Canvas的线程安全,我看了该实例中TPaintBox的父亲TGraphicControl,它在WMPaint里头确实有Lock,Unlock。
 
所有的VCL都不是线程安全的,这句话是权威
 
Lock之后都串形化了哪来的多线程^_^
 
Canvas是线程安全的,
procedure Tpcross.Execute;
begin
while not Terminated do
begin
//Fcanvas.FillRect(Frect);
Fcanvas.Lock;
你的代码
Fcanvas.Unlock;
end;
end;
 
看看Lock和Unlock的代码就知道了,lock里用了临界来做同步,包括对FFont和FPen做同步,所以用了Canvas后就线程安全了,否则是不安全的
 
Lock只是对这个DC句柄的保护,但是DC整个操作系统都只有几个(《高手开发箴言》),很多的DC都是指向系统的同一个结构,所以,很难全局的保护,最好的方法,就是在主线程里面进行绘画控制,否则,死机是必然中的偶然(死机说的是程序,不是操作系统)。
Synchronize
方法就是把事情放到主线程里面去执行。
 
来自:诸葛白痴, 时间:2006-5-25 22:22:04, ID:3453472
所有的VCL都不是线程安全的,这句话是权威

我不同意
至少TADOConnection就是线程安全的了。
大部的VCL组件为了效率都不是,但是也有部分组件是线程安全的

Canvas用Lock后就是线程安全的
 
后退
顶部