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 中先创建一个挂起的线程,然后再调用,调用过程还是有点小复杂,
  • 相关阅读:
    HashTable、HashSet和Dictionary的区别
    CCF_ 201312-3_最大的矩形
    CCF_ 201312-2_ISBN号码
    CCF_201312-1_出现次数最多的数
    CCF_ 201509-2_日期计算
    CCF_ 201512-3_画图
    CCF_ 201512-2_消除类游戏
    CCF_ 201409-2_画图
    CCF_201409-1_相邻数对
    CCF_ 201412-1_门禁系统
  • 原文地址:https://www.cnblogs.com/chengxin1982/p/1623575.html
Copyright © 2011-2022 走看看