« 在INF中找不到所需的段落 错误的可能解决方法Delphi 2007已内建对GIF动画显示的持 »

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

实现:
       关键在于对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;

===============================================

另一个例子:http://topic.csdn.net/t/20011015/02/323001.html

   unit    Unit1;   
    
   interface   
    
   uses   
       Windows,    Messages,    SysUtils,    Variants,    Classes,    Graphics,    Controls,    Forms,   
       Dialogs,    StdCtrls,    ExtCtrls;   
    
   type   
       TForm1    =    class(TForm)   
           Button1:    TButton;   
           Edit1:    TEdit;   
           Image1:    TImage;   
           procedure    Button1Click(Sender:    TObject);   
       private   
           {    Private    declarations    }   
       public   
           {    Public    declarations    }   
       end;   
    
       TMyThread    =    class(TThread)   
       private   
           child    :    TComponent;   
    
       public   
           procedure    draw;   
           constructor    Create(parent    :    TComponent);   
           procedure    Execute;    override;   
    
       end;   
    
   var   
       Form1:    TForm1;   
   implementation   
    
   {$R    *.dfm}   
    
   {    TMyThread    }   
    
   constructor    TMyThread.Create(parent:    TComponent);   
   begin   
       child    :=    parent;   
       inherited    Create(false);   
   end;   
    
   procedure    TMyThread.draw;   
   begin   
       if    (child    is    TEdit)    then   
       begin   
           (child    as    TEdit).Text    :=    'OK';   
       end   
       else    if(child    is    TImage)    then   
       begin   
           (child    as    TImage).Canvas.Brush.Color    :=    clBlue;   
           (child    as    TImage).Canvas.FillRect(rect(0,0,100,100));   
       end;   
   end;   
    
   procedure    TMyThread.Execute;   
   begin   
       inherited;   
       synchronize(draw);   
       if    Terminated    then    Exit;   
   end;   
    
   procedure    TForm1.Button1Click(Sender:    TObject);   
    
   begin   
       TMythread.Create(Edit1);   
       TMythread.Create(image1);   
   end;   
    
    
   end.   

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。