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

    View Code
    {*******************************************************}
    { }
    { Delphi Thread Sample 2 }
    { Creation Date 2011.06.30 }
    { Created By: ming }
    { }
    {*******************************************************}
    unit unitWorkThread;

    interface

    uses
    Classes,Windows, Messages, SysUtils, Graphics, StdCtrls;

    type
    TWorkThread
    = class(TThread)
    private
    { Private declarations }
    FEvent: HWND;
    FMsg:
    string;
    FMemo: TMemo;
    FInterval: Cardinal;
    procedure doSyncProc1;
    procedure doSomething;
    procedure syncOutputMsg;
    procedure doOutputMsg(const msg: string);
    procedure _sleep(millisecond:Cardinal);
    protected
    procedure Execute; override;
    public
    constructor Create(Suspend: boolean); overload;
    constructor Create(Suspend: boolean; mmoOutput: TMemo); overload;
    destructor Destroy; override;
    public
    procedure exitThread;
    public
    property Interval:Cardinal read FInterval write FInterval;
    end;

    var
    WorkThread: TWorkThread;
    const
    WM_TEST1
    = WM_USER + 1000; //range (WM_USER - $7FFF)
    WM_TEST2
    = WM_APP + 100; //range (WM_APP - $BFFF)

    implementation

    { TWorkThread }

    constructor TWorkThread.Create(Suspend: boolean);
    begin
    inherited Create(Suspend);
    FEvent :
    = CreateEvent(nil,False,False,nil);
    FreeOnTerminate :
    = True;
    FInterval :
    = 100;
    end;

    constructor TWorkThread.Create(Suspend: boolean; mmoOutput: TMemo);
    begin
    inherited Create(Suspend);
    FEvent :
    = CreateEvent(nil,False,False,nil);
    FreeOnTerminate :
    = True;
    FInterval :
    = 100;
    FMemo :
    = mmoOutput;
    doOutputMsg(
    'Thread Create');
    end;

    destructor TWorkThread.Destroy;
    begin
    CloseHandle(FEvent);
    doOutputMsg(
    'Thread Destroy');
    inherited;
    end;

    procedure TWorkThread.doSyncProc1;
    begin

    end;

    procedure TWorkThread.doOutputMsg(const msg: string);
    begin
    FMsg :
    = msg;
    Synchronize(syncOutputMsg);
    end;

    procedure TWorkThread.syncOutputMsg;
    begin
    if Assigned(FMemo) then
    FMemo.Lines.Add(FMsg);
    end;

    procedure TWorkThread.doSomething;
    begin
    //Synchronize(doSyncProc1);
    doOutputMsg(FormatDateTime(
    'HH:NN:SS',now));
    end;

    {
    GetMessage 阻塞模式类似于SendMessage
    PeekMessage 非阻塞模式类似于PostMessage
    }
    {.$DEFINE _BLOCKMSG}
    procedure TWorkThread.Execute;
    var
    aMsg: TMsg;
    begin
    inherited;
    {$IFDEF _BLOCKMSG}
    while GetMessage(aMsg,0,0,0) do
    begin
    case aMsg.message of
    WM_QUIT:
    begin
    Break;
    end;
    WM_TEST1:
    begin
    doOutputMsg(
    'Received Msg1');
    doSomething;
    end;
    WM_TEST2:
    begin
    doOutputMsg(
    'Received Msg2');
    doSomething;
    end;
    end;
    end;
    {$ELSE}
    while not Terminated do
    begin
    if PeekMessage(aMsg,0,0,0,PM_REMOVE) then
    begin
    case aMsg.message of
    WM_QUIT:
    begin
    Break;
    end;
    WM_TEST1:
    begin
    doOutputMsg(
    'Received Msg1');
    end;
    WM_TEST2:
    begin
    doOutputMsg(
    'Received Msg2');
    end;
    end;
    end;
    doSomething;
    _sleep(FInterval);
    end;
    {$ENDIF}
    end;

    procedure TWorkThread.exitThread;
    begin
    PostThreadMessage(Self.ThreadID,WM_QUIT,
    0,0);
    if Suspended then Resume;
    end;

    procedure TWorkThread._sleep(millisecond: Cardinal);
    begin
    WaitForSingleObject(Self.Handle,millisecond);
    end;

    {=============================================================}
    {uses unitWorkThread;

    procedure TForm1.btnCreateThreadClick(Sender: TObject);
    begin
    if Assigned(WorkThread) then exit;
    WorkThread := TWorkThread.Create(False,mmoOutput);
    WorkThread.Interval := 1000;
    if WorkThread.Suspended then
    WorkThread.Resume;
    end;

    procedure TForm1.btnDestroyThreadClick(Sender: TObject);
    begin
    if Assigned(WorkThread) then
    begin
    WorkThread.exitThread;
    WorkThread := nil;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if Assigned(WorkThread) then
    PostThreadMessage(WorkThread.ThreadID,WM_TEST1,0,0);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    if Assigned(WorkThread) then
    PostThreadMessage(WorkThread.ThreadID,WM_TEST2,0,0);
    end;
    }

    end.

  • 相关阅读:
    理解二进制操作
    web前端代码重构
    Tomcat是一个Servlet容器?
    对于python命令行参数使用,你应该这么做才专业
    利用深度学习识别滑动验证码缺口位置
    机器学习笔记(十)---- KNN(K Nearst Neighbor)
    基于NB-IoT的智慧路灯监控系统(项目简介)
    【读一本书】《昇腾AI处理器架构与编程》--神经网络基础知识(2)
    高性能Web动画和渲染原理系列(4)“Compositor-Pipeline演讲PPT”学习摘要【华为云技术分享】
    华为云数据库亮相下一代数据技术发展论坛,助力“数字一带一路”
  • 原文地址:https://www.cnblogs.com/Jekhn/p/2094190.html
Copyright © 2011-2022 走看看