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