zoukankan      html  css  js  c++  java
  • Delphi线程类(三)

    View Code
    type
      TfrmMain = class(TForm)
        mmoMsg: TMemo;
        btnNewThread: TButton;
        btnShutdownAll: TButton;
        procedure btnNewThreadClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btnShutdownAllClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
      TTestThread = class(TThread)
      private
        FSignalShutdown: Boolean;
        FWinHandle: HWND;
        FMemo: TMemo;
        FMsg: String;
        procedure DeallocateHwnd(Wnd: HWND);
        procedure OnThreadTerminate(Sender: TObject);
        procedure syncOutputMsg;
        procedure doOutputMsg(const msg: string); overload;
        procedure doOutputMsg(const fmtStr:string; const params: array of const); overload;
      protected
        procedure Execute; override;
        procedure WndProc(var Msg: TMessage);
      public
        constructor Create(mmoOutput: TMemo);
        destructor Destroy; override;
      end;
    
    var
      frmMain: TfrmMain;
    
    implementation
    
    var
      WM_SHUTDOWN_THREAD: Cardinal;
    
    {$R *.fmx}
    
    { TTestThread }
    
    constructor TTestThread.Create(mmoOutput: TMemo);
    begin
      FMemo := mmoOutput;
      FSignalShutdown := False;
      FWinHandle := AllocateHWnd(WndProc);
      FreeOnTerminate := True;
      OnTerminate := OnThreadTerminate;
      inherited Create(False);
    end;
    
    procedure TTestThread.DeallocateHwnd(Wnd: HWND);
    var
      Instance: Pointer;
    begin
      Instance := Pointer(GetWindowLong(Wnd,GWL_WNDPROC));
      if Instance <> @DefWindowProc then
        SetWindowLong(Wnd,GWL_WNDPROC,LongInt(@DefWindowProc));
      FreeObjectInstance(Instance);
      DestroyWindow(Wnd);
    end;
    
    destructor TTestThread.Destroy;
    begin
      DeallocateHwnd(FWinHandle);
      inherited;
    end;
    
    procedure TTestThread.OnThreadTerminate(Sender: TObject);
    begin
      frmMain.mmoMsg.Lines.Add('Thread ' + IntToStr(ThreadID) + ' shutting down.');
    end;
    
    procedure TTestThread.doOutputMsg(const msg: string);
    begin
      FMsg := msg;
      Synchronize(syncOutputMsg);
    end;
    
    procedure TTestThread.doOutputMsg(const fmtStr:string; const params: array of const);
    begin
      FMsg := Format(fmtStr,params);
      Synchronize(syncOutputMsg);
    end;
    
    procedure TTestThread.syncOutputMsg;
    begin
      if Assigned(FMemo) then FMemo.Lines.Add(FMsg);
    end;
    
    procedure TTestThread.Execute;
    begin
      inherited;
      while not FSignalShutdown do
      begin
        Sleep(10);
        doOutputMsg('Thid: %d, Time: %s',[ThreadID
          ,FormatDateTime('yyyy-mm-dd hh:nn:ss zzz',now)]);
      end;
    end;
    
    procedure TTestThread.WndProc(var Msg: TMessage);
    begin
      if Msg.Msg = WM_SHUTDOWN_THREAD then
        FSignalShutdown := True
      else
        Msg.Result := DefWindowProc(FWinHandle,Msg.Msg,Msg.WParam,Msg.LParam);
    end;
    
    procedure TfrmMain.btnNewThreadClick(Sender: TObject);
    var
      a: TTestThread;
    begin
      a := TTestThread.Create(frmMain.mmoMsg);
      frmMain.mmoMsg.Lines.Add('Thread ' + IntToStr(a.ThreadID) + ' created.');
    end;
    
    procedure TfrmMain.btnShutdownAllClick(Sender: TObject);
    begin
      //SendMessage(wnd_broadcast, WM_SHUTDOWN_THREAD, 0, 0);
      PostMessage(wnd_broadcast, WM_SHUTDOWN_THREAD, 0, 0);
    end;
    
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      WM_SHUTDOWN_THREAD := RegisterWindowMessage('WM_SHUTDOWN_THREAD_001');
    end;
    
    end.
  • 相关阅读:
    springmvc整合mybatis框架源码 bootstrap
    观察者模式与.Net Framework中的委托与事件
    C#类型基础——学习笔记一
    知识图谱简介及常见应用场景
    Go语言实现bitmap算法
    互联网公司不同发展阶段需要什么样的技术负责人
    Go语言中使用切片(slice)实现一个Vector容器
    Go语言中defer语句使用小结
    使用interface与类型诊断机制判断一个类型是否实现了某个方法
    互联网产品发掘种子用户和意见领袖的方法
  • 原文地址:https://www.cnblogs.com/Jekhn/p/2466125.html
Copyright © 2011-2022 走看看