• 自己封装线程(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 中先创建一个挂起的线程,然后再调用,调用过程还是有点小复杂,
  • 相关阅读:
    并发编程--锁--锁的理解及分类
    String -- 从源码剖析String类
    Spring 抽象的缓存包 spring-cache
    小白学做菜笔记
    使用Lists.partition切分性能优化
    String--常见面试题
    常用的Linux命令
    去除字符串中的空格
    微信小程序切换选中状态
    微信小程序面试题总结
  • 原文地址:https://www.cnblogs.com/chengxin1982/p/1623575.html
Copyright © 2020-2023  润新知