多线程中如何使用Synchronize函数?(100分)

  • 主题发起人 主题发起人 zyq.ks
  • 开始时间 开始时间
Z

zyq.ks

Unregistered / Unconfirmed
GUEST, unregistred user!
调用函数何时需加Synchronize?
写多线程程序应注意什么?
 
DELPHI生成线程类的哪个PAS里不是说了,如何使用Synchronize方法
如果知道具体的可以看看《DELPHI5开发人员指南》
 
说来话长,看看《delphi5开发人员指南》吧,里面说得很详细了。
一般要用的情况是:
你在线程里调用了主线程的方法或主线程的VCL资源时用。
具体情况具体分析,你可以把问题贴来看看?
 
大概是更新窗口控件值,或访问数据库时使用吧!
 
因为VCL界面控件不是线程安全的,所以线程中调用界面组件时,
通过Synchronize将调用转给主线程,主线程执行完成后,线程继续运行
这个函数的参数是一个没有参数没有返回值的类成员方法
此方法,被间接通过主线程调用
 
//主程序Unit1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyIndex: Integer;
end;

var
Form1: TForm1;

implementation
uses Unit2;
{$R *.dfm}
var
ThreadTmp: MyThread;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyIndex := 0;
ThreadTmp := MyThread.Create(false);
end;

end.

//线程Unit2
unit Unit2;
interface
uses
Classes, SysUtils;
type
MyThread = class(TThread)
private
{ Private declarations }
Procedure MyPro;
protected
procedure Execute;
override;
end;

implementation
uses Unit1;
procedure MyThread.Execute;
begin
{ Place thread code here }
while not Terminateddo
Synchronize(MyPro);
//循环执行自己定义的过程
end;

procedure MyThread.MyPro;
begin
Inc(Form1.MyIndex);
Form1.Edit1.Text := IntToStr(Form1.MyIndex);
Form1.Edit2.Text := IntToStr(Form1.MyIndex);
Sleep(20);
end;

end.

//这只不过是简单的代码,你可以去查查资料,DFW以前的贴子说得也多!
//拖动窗体是,没有任何停顿的感觉
//如果用Timer定义时,就会出现停顿
 
如果在线程中想调用函数AA,详细如下:
function aa:boolean;
begin
....
bb;
....
end;

procedure bb;
begin
....
调用QUERY查询数库
....
end;

线程中调用AA是否要用Synchronize?
是在线程中Synchronize(aa)还是在函数AA中Synchronize(bb)?
 
1>>线程中调用AA是否要用Synchronize?
2>>是在线程中Synchronize(aa)还是在函数AA中Synchronize(bb)?
1. 如果Query是主线程的东东,且在查询过程中主线程有可能用到Query那么要用sync..
一般来讲做查询的query设计时都是设计为单独的,所以一般来讲是不用sync的。
2. 都一样。
 
涉及到VCL就要同步。
 
后退
顶部