线程的简单问题6:线程同步Synchronize() ( 积分: 10 )

  • 主题发起人 主题发起人 ppqingyu
  • 开始时间 开始时间
P

ppqingyu

Unregistered / Unconfirmed
GUEST, unregistred user!

关于Synchronize这个方法,我找到的答案只说用于和VCL同步。我想问一下,所有关于可视化控件中,如果要在线程中使用,都要用Synchronize()进行同步?
 

关于Synchronize这个方法,我找到的答案只说用于和VCL同步。我想问一下,所有关于可视化控件中,如果要在线程中使用,都要用Synchronize()进行同步?
 
Syncharonize(方法名)使用是比较方便的,比如
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
thread1 = class(TThread)
private
procedure ShowtoEdit(i:integer);
{ Private declarations }
protected
procedure Execute;
override;
end;

implementation
uses Unit1;
procedure thread1.Execute;
var i:integer;
begin
for i:=1 to 10000do
ShowtoEdit(i);
end;
procedure thread1.ShowtoEdit(i:integer);
begin
form1.Edit1.Text:=inttostr(i);
end;

end.
 
VCL存在缺陷,使用时对象的属性和方法不能保证是Thread-safe的,也就是说,访问
这些属性或者执行这些方法可能会产生冲突。Synchronize过程就是用来解决这个问题
的。它用Method参数指定一个方法,用这个方法去访问VCL。线程本身并不调用这个方
法,而是通知主线程调用这个方法,主线程一次只能收到一个通知,这样就避免了对
VCL的并发访问,从而避免了访问冲突。
 
就是说所有关于VCL的都要同步啦.
我自己写了一个很简单的条线,就是用于数据库查询并显示出来,偶尔会出错,我还以前是其他什么的时间,这样看来,应该是线程用到窗体那边的控件的问题罗,是不是这样?
 
多人接受答案了。
 
后退
顶部