Delphi中多线程用Synchronize实现VCL数据同步显示

Delphi 中多线程用 Synchronize 实现 VCL 数据同步显示
Lanno Ckeeke 
2006-5-12
概述:
       VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现。在类的Execute中只须调用Synchronize就可以了。
实现:
       关键在于对Synchronize参数的定义。定义一个无参数的procedure通过它来访问类的成员变量szName和nIndex。在类的重载Execute中调用Synchronize。
子类的定义如下:
  1. unit TChildThread;
  2.  
  3. interface
  4.  
  5. uses
  6.  Classes,Messages,Windows,SysUtils;
  7.  
  8. const MAX_LEN = 260;
  9. type
  10.  TChildThreads = class(TThread)
  11.  private
  12.     { Private declarations }
  13.  protected
  14. procedure Execute; override;
  15. //同步函数的声明
  16.     procedure UpdateData;
  17.  public
  18.      szName : array[0..MAX_LEN] of Char;
  19.     nIndex : Integer;
  20.  end;
  21.  
  22. implementation
  23. uses
  24.        Unit1;
  25.  
  26. { Important: Methods and properties of objects in VCL or CLX can only be used
  27.  in a method called using Synchronize, for example,
  28.  
  29.       Synchronize(UpdateCaption);
  30.  
  31.  and UpdateCaption could look like,
  32.  
  33.     procedure TChildThread.UpdateCaption;
  34.     begin
  35.       Form1.Caption := 'Updated in a thread';
  36.     end; }
  37.  
  38. { TChildThread }
  39. //同步函数的实现
  40. procedure TChildThreads.UpdateData;
  41. begin
  42.        Form1.ShowData.Items.Add(PChar(@szName));
  43. end;
  44.  
  45. procedure TChildThreads.Execute;
  46. begin
  47.  { Place thread code here }
  48.  //调用同步过程
  49.  Synchronize(UpdateData);
  50. end;
  51.  
  52. end.

主程的设计与《Delphi中多线程用消息实现VCL数据同步显示》基本一致,但为了与其显示相同结果,在生成子线程中语句顺序作了一下调整。以下代码仅显示与上一篇不同的一个过程,其它代码不再赘述。
  1. procedure TForm1.StartThreadsClick(Sender: TObject);
  2. var
  3.        oChildThread : array[0..1000of TChildThreads;
  4.  i : Integer;
  5. begin
  6.        For i := 0 to 1000 do
  7.  begin
  8.      oChildThread[i] := TChildThreads.Create(true);
  9.     //注意这里的代码与消息同步中的顺序。
  10.     oChildThread[i].nIndex := i;
  11.     strcopy(@oChildThread[i].szName,PChar('Child' + IntToStr(i)));
  12.     oChildThread[i].Resume;
  13.  end;
  14.  
  15. end;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值