zoukankan      html  css  js  c++  java
  • 扩展 delphi 线程 使之传递参数.

    新delphi的线程TThread有了CreateAnonymousThread方法,如果再为它加一个可传递的参数不就更好了吗?代码如下:

      TAnonymousThreadX<T> = class(TThread)
      private
        FProc: TProc<T>;
        AValue:T;
      protected
        procedure Execute; override;
      public
        constructor Create(const AProc: TProc<T>;ProcPar:T);
      end;
    TThreadHelper
    = class helper for TThread public class function CreateAnonymousThreadX<T>(const ThreadProc: TProc<T>;proPar:T): TThread; static; end; implementation { TAnonymousThreadX } constructor TAnonymousThreadX<T>.Create(const AProc: TProc<T>;ProcPar:T); begin inherited Create(True); FreeOnTerminate := True; FProc := AProc; Avalue:=ProcPar; end; procedure TAnonymousThreadX<T>.Execute; begin inherited; FProc(Avalue); end; { TThreadHelper } class function TThreadHelper.CreateAnonymousThreadX<T>(const ThreadProc: TProc<T>; proPar: T): TThread; begin Result := TAnonymousThreadX<T>.Create(ThreadProc,proPar); end;

    代码挺简单的,就是传递了一个方法及参数. 在线程里调用就是了.

    将以上代码保存在一个单元中,引用了之后,就可以这样用了:

    //这样使用
    TThread.CreateAnonymousThreadX<Integer>(TestX,1234).Start;
    
    //这是TestX方法体
    procedure T***.TestX(Avalue: Integer);
    begin
      btnContinue.Caption:=IntToStr(Avalue);
    end;
    
    
    //如果不想定义TestX方法,也可以如下方法直接调用
      TThread.CreateAnonymousThreadX<Integer>(
      procedure(Avalue:Integer)
      begin
        btnContinue.Caption:=IntToStr(Avalue);
      end
      ,12345).Start;

    如果执行线程的方法有两个,三个参数,对照着改就是了.

    这样用线程是不是更简单一些了呢.

  • 相关阅读:
    mac 外接显示屏的坑
    ssh 多秘钥管理和坑
    CircleCI 前端自动部署
    jest 事件测试
    await Vue.nextTick() 的含义分析
    Jest 里面需要注意的几个小细节
    element 库 date-picker 的 disabledDate 的坑
    jest 提示 Unexpected identifier 的解决方案
    preventDefault 和 stopPropagation
    数据库:Flask-SQLAlchemy
  • 原文地址:https://www.cnblogs.com/ttgss/p/3334723.html
Copyright © 2011-2022 走看看