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

来源:互联网 发布:软件学徒招聘骗局 编辑:程序博客网 时间:2024/06/07 13:44
概述:
       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;
  16. 转载地址:http://blog.csdn.net/maxcode/article/details/726766
0 0
原创粉丝点击