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.
  • 相关阅读:
    自己的文件管理软件,想怎样分类管理就怎样分类
    给博客园发展支点招
    看看自己存在哪些的个人知识管理问题和烦恼呢?
    2008年个人知识管理软件测评[草稿]
    獲取某天是星期幾
    創建鏈接服務器
    在.NET中调用Oracle9i存储过程经验总结
    C#转换成VB.net或vb.net转换成C#
    話說我們家姚明
    解决winxp搜索不到文件的问题!
  • 原文地址:https://www.cnblogs.com/Jekhn/p/2466125.html
Copyright © 2011-2022 走看看