zoukankan      html  css  js  c++  java
  • 自己封装线程(Demo)

    代码
    unit theadTest;

    interface

    uses
      Windows, Classes;

    type
      MyThread 
    = class
      
    private
        FHandle: THandle;
        FSuspended: Boolean;
        FThreadID: THandle;
        FThradNodity: TNotifyEvent;
        FTerminated:  Boolean;
        
    procedure SetSuspended(Value: Boolean);
      
    protected
        
    procedure Execute; virtual;
        
    property Terminated: Boolean read FTerminated;
      
    public
        
    constructor Create(CreateSuspended: Boolean);
        
    destructor Destroy; override;
        
    procedure Terminate;
        
    property Handle: THandle read FHandle;
        
    property Suspended: Boolean read FSuspended write SetSuspended;
        
    property ThreadID: THandle read FThreadID;
        
    property ThradNodity: TNotifyEvent read FThradNodity write FThradNodity;
      
    end;

    implementation

    { MyThread }

    function ThreadProc(Param: Pointer): Integer;
    begin
      
    try
        
    if not MyThread(Param).Terminated then
          
    try
            MyThread(Param).Execute;
          
    except
          
    end;
      
    finally
        Result :
    = 0;
      
    end;
    end;  

    constructor MyThread.Create(CreateSuspended: Boolean);
    begin
      
    inherited Create;
      FSuspended :
    = CreateSuspended;
      FHandle :
    = BeginThread(nil0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
    end;

    destructor MyThread.Destroy;
    begin
      
    if FHandle <> 0 then CloseHandle(FHandle);
      
    inherited Destroy;
    end;

    procedure MyThread.Execute;
    begin
      
    while not Terminated do
      
    begin
        
    if Assigned(ThradNodity) then
          ThradNodity(
    nil);
      
    end;  
    end;

    procedure MyThread.SetSuspended(Value: Boolean);
    begin
      
    if Value <> FSuspended then
        FSuspended :
    = Value;
    end;

    procedure MyThread.Terminate;
    begin
      FTerminated :
    = True;
    end;

    end.

    调用
    var
      Test1: MyThread;

    var
      H: THandle;
    begin
      Test1 := MyThread.Create(False);
      Test1.ThradNodity := ThreadNodity;

      DuplicateHandle(GetCurrentProcess, Test1.Handle, GetCurrentProcess, @H, DUPLICATE_SAME_ACCESS, TRUE, DUPLICATE_SAME_ACCESS);
      Windows.ResumeThread(H);
    //  Windows.ResumeThread(Test1.Handle);
      Windows.ResumeThread(H);
    end;


    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if Assigned(Test1) then
      begin
        if Test1.Handle <> 0 then
          Test1.Terminate;
        Test1.Free;
      end;
    end;


    思路基本是DELPHI VCL 中Thread的封装思路,主要是测试用
    VCL 中先创建一个挂起的线程,然后再调用,调用过程还是有点小复杂,
  • 相关阅读:
    zt 必看: 原来PCIe技术原理这么简单!
    zt linux:centos 解决SSH连接Linux超时自动断开
    idea总结和未来的想法
    linux一些技巧
    zt如何解决Verilog目前不支持数组型端口定义!
    高速设计学习-干货!高速串行Serdes均衡之FFE
    zt:tcpdump抓包对性能的影响
    zt:TCP 学习
    verdi使用
    IE 浏览器下 button元素自动触发click?
  • 原文地址:https://www.cnblogs.com/chengxin1982/p/1623575.html
Copyright © 2011-2022 走看看