Delphi
中多线程用
Synchronize
实现
VCL
数据同步显示
Lanno Ckeeke
2006-5-12
概述:
VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现。在类的Execute中只须调用Synchronize就可以了。
实现:
关键在于对Synchronize参数的定义。定义一个无参数的procedure通过它来访问类的成员变量szName和nIndex。在类的重载Execute中调用Synchronize。
子类的定义如下:
- unit TChildThread;
- interface
- uses
- Classes,Messages,Windows,SysUtils;
- const MAX_LEN = 260;
- type
- TChildThreads = class(TThread)
- private
- { Private declarations }
- protected
- procedure Execute; override;
- //同步函数的声明
- procedure UpdateData;
- public
- szName : array[0..MAX_LEN] of Char;
- nIndex : Integer;
- end;
- implementation
- uses
- Unit1;
- { Important: Methods and properties of objects in VCL or CLX can only be used
- in a method called using Synchronize, for example,
- Synchronize(UpdateCaption);
- and UpdateCaption could look like,
- procedure TChildThread.UpdateCaption;
- begin
- Form1.Caption := 'Updated in a thread';
- end; }
- { TChildThread }
- //同步函数的实现
- procedure TChildThreads.UpdateData;
- begin
- Form1.ShowData.Items.Add(PChar(@szName));
- end;
- procedure TChildThreads.Execute;
- begin
- { Place thread code here }
- //调用同步过程
- Synchronize(UpdateData);
- end;
- end.
主程的设计与《Delphi中多线程用消息实现VCL数据同步显示》基本一致,但为了与其显示相同结果,在生成子线程中语句顺序作了一下调整。以下代码仅显示与上一篇不同的一个过程,其它代码不再赘述。
- procedure TForm1.StartThreadsClick(Sender: TObject);
- var
- oChildThread : array[0..1000] of TChildThreads;
- i : Integer;
- begin
- For i := 0 to 1000 do
- begin
- oChildThread[i] := TChildThreads.Create(true);
- //注意这里的代码与消息同步中的顺序。
- oChildThread[i].nIndex := i;
- strcopy(@oChildThread[i].szName,PChar('Child' + IntToStr(i)));
- oChildThread[i].Resume;
- end;
- end;