• Delphi中多线程用消息实现VCL数据同步显示


    Delphi中多线程用消息实现VCL数据同步显示
    
    Lanno Ckeeke 
    
    2006-5-12
    
    概述:
    
    delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新。
    
    实现:
    
    关键在于消息的发送及接收。在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据。如传递字符数组:
    
    数组定义:
    
    
                  const 
    
    MAX_LEN = 260;
    
                  szName : array[0..MAX_LEN] of Char;
     
    
    消息发送方式:
    
                  PostMessage(Form1.Handle,WM_UPDATEDATA,Integer(PChar(@szName)),0);
    
    消息接收方式:
    
    
                  procedure TForm1.WMUpdateData(var msg : TMessage);
    
    begin
    
           self.ShowData.Items.Add(PChar(msg.WParam));
    
    end;
     
    
     
    
    子线程中定义两个数据类型:
    
    
     public
    
         szName : array[0..MAX_LEN] of Char;
    
        nIndex : Integer;
     
    
     
    
    完整代码:
    
    子线程类:
    
    
    unit TChildThread;
    
     
    
    interface
    
     
    
    uses
    
     Classes,Messages,Windows,SysUtils;//添加的使用文件
    
     
    
    const MAX_LEN = 260;
    
    type
    
     TChildThreads = class(TThread)
    
     private
    
        { Private declarations }
    
     protected
    
        procedure Execute; override;
    
     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.Execute;
    
    begin
    
     { Place thread code here }
    
       PostMessage(Form1.Handle,WM_UPDATEDATA,Integer(PChar(@szName)),0);
    
       //注意类型转化部分的写法
    
    end;
    
     
    
    end.
     
    
    主线程代码:
    
    
    unit Unit1;
    
     
    
    interface
    
     
    
    uses
    
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    
     Dialogs, StdCtrls, ComCtrls;
    
     
    
    const
    
           WM_UPDATEDATA = WM_USER + 100;//自定义的消息,利用此消息来实现对GUI的更新
    
    type
    
     TForm1 = class(TForm)
    
        ControlPannel: TGroupBox;
    
        StartThreads: TButton;
    
        TabControl1: TTabControl;
    
        SingleThread: TRadioButton;
    
        MultipleThreads: TRadioButton;
    
        StopThreads: TButton;
    
        ShowData: TListBox;
    
        ShowError: TListBox;
    
        Initialize: TButton;
    
    Cleanup: TButton;
    
    //GUI更新的消息处理函数声明
    
         procedure WMUpdateData(var msg : TMessage);message WM_UPDATEDATA;
    
        procedure StartThreadsClick(Sender: TObject);
    
     private
    
        { Private declarations }
    
     public
    
        { Public declarations }
    
     end;
    
     
    
    var
    
     Form1: TForm1;
    
     
    
    implementation
    
    uses
    
           TChildThread;
    
     
    
    {$R *.dfm}
    
    //消息函数定义
    
    procedure TForm1.WMUpdateData(var msg : TMessage);
    
    begin
    
           self.ShowData.Items.Add(PChar(msg.WParam));
    
    end;
    
     
    
    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);
    
        //向VCL中发送的数据
    
        strcopy(@oChildThread[i].szName,PChar('Child' + IntToStr(i)));
    
        oChildThread[i].nIndex := i;
    
        oChildThread[i].Resume;
    
     end;
    
     
    
    end;
    
     
    
    end. 
  • 相关阅读:
    在Postman用post方式请求webapi
    C#控制台为输出内容设置背景色和字体颜色
    不卡界面,实现文件上传
    编译后的dll,xml,pdb分别是什么内容,各有什么用处?
    C#的dynamic解析xml
    Oracle中的正则表达式
    oracle中 connect by 递归查询用法
    oracle中 listagg() WITHIN GROUP () 行转列函数的使用
    oracle中dualde使用
    MYSQL基本命令
  • 原文地址:https://www.cnblogs.com/moonwind/p/4495708.html
Copyright © 2020-2023  润新知