• IdSchedulerOfThreadPool用法和想法


    是否IdSchedulerOfThreadPool在设置好常用的属性后就可以正常运用,不用做多余的设置?

    IdSchedulerOfThreadPool1.PoolSize:=30;
    IdSchedulerOfThreadPool1.MaxThreads:=100;

    以下是 IdSchedulerOfThreadPool1 的用法!

    出处:http://blog.csdn.net/applebomb/article/details/1854603

    Indy 10有一个组件叫IdSchedulerOfThreadPool,网上没有其相关使用代码,好在有源代码,于是自己看。其实用起来也还比较简单,主要是实现了维护一个线程池的功能,功能不是很强。不过基于该组件的开发,也可以为我们省了不少代码,增强了些功能。

    与该线程池使用相关的类主要有:
    TIdSchedulerOfThreadPool 这个不用说
    TIdTask(in IdTask.pas) 需要用户继承实现的类,实现参数的传入,及具体的run、BeforeRun、AfterRun功能代码
    TIdYarnOfThread(in IdSchedulerOfThread.pas) 需要强制转换的类,只有强制转换后才能访问到线程Thread对象,使用Synchronize来访问VCL控件

    ------------------------ Unit.pas ----------------------
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, IdSchedulerOfThreadPool, IdYarn,
      IdScheduler, IdBaseComponent, IdSchedulerOfThread, Spin;

    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        IdSchedulerOfThreadPool1: TIdSchedulerOfThreadPool;
        Button4: TButton;
        Button2: TButton;
        SpinEdit1: TSpinEdit;
        Button3: TButton;
        procedure Button4Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
      aStr: string;

    implementation

    uses
      UnitUploadTask;

    {$R *.dfm}

    procedure TForm1.Button4Click(Sender: TObject); //线程池添加线程
    var
      mytask: TUploadTask;
      idYarn: TIdYarn;
      obj: UploadParamObj;
    begin
      obj := UploadParamObj.Create;
      obj.str := SpinEdit1.Text;

      idYarn := IdSchedulerOfThreadPool1.AcquireYarn;
      mytask := TUploadTask.Create(idYarn, obj);
      IdSchedulerOfThreadPool1.StartYarn(idYarn, mytask);
    end;

    procedure TForm1.Button3Click(Sender: TObject); //线程池结束线程
    begin
    IdSchedulerOfThreadPool1.TerminateAllYarns;
    end;

    procedure TForm1.Button2Click(Sender: TObject); //查看活动线程数
    begin
      with IdSchedulerOfThreadPool1.ActiveYarns.LockList do try
        ShowMessage(IntToStr(count));
      finally
        IdSchedulerOfThreadPool1.ActiveYarns.UnlockList;
      end;
    end;

    procedure TForm1.FormCreate(Sender: TObject); //初始化线程池
    begin
      IdSchedulerOfThreadPool1.Init;
    end;

    end.


    ------------------------------------- UnitUploadTask.pas ---------------------------------
    unit UnitUploadTask;

    interface

    uses
      Classes, SysUtils, IdTask, IdYarn;

    type
      UploadParamObj = class(TObject)
      public
        str: string;
      end;

      TUploadTask = class(TIdTask)
      private
        thread: TThread;
        trytime: Integer;
        procedure output;
      protected
          function Run: Boolean; override;
          procedure BeforeRun; override;
          procedure AfterRun; override;
      public
          constructor Create(AYarn: TIdYarn; obj: UploadParamObj);
      end;

    implementation

    uses
      Unit1, IdSchedulerOfThread;

    constructor TUploadTask.Create(AYarn: TIdYarn; obj: UploadParamObj);
    begin
      FData := obj;
      trytime := 3;
      thread := TIdYarnOfThread(AYarn).Thread;
      inherited Create(AYarn);
    end;

    function TUploadTask.Run: Boolean;
    begin
      thread.Synchronize(thread, output);

      Sleep(5000);
      if trytime > 0 then
      begin
        Dec(trytime);
        result := True;
      end
      else
        Result := False;
    end;

    procedure TUploadTask.BeforeRun;
    begin
      Form1.Memo1.Lines.Add('BeforeRun' + UploadParamObj(FData).str);
    end;

    procedure TUploadTask.AfterRun;
    begin
      Form1.Memo1.Lines.Add('AfterRun' + UploadParamObj(FData).str);
    end;

    procedure TUploadTask.output;
    begin
      Form1.Memo1.Lines.Add('上传开始,str=' + UploadParamObj(FData).str + ', try=' + IntToStr(trytime) +',id=' + IntToStr(thread.ThreadID));
    end;

    end.

    操作你会发现,线程池是用抛出异常来实现,因此你需要捕获异常来进行线程池满的处理。

  • 相关阅读:
    哨兵模式(工作中使用)
    JVM调优-考虑方向
    Spring Cloud Gateway+Nacos出现服务乱串的问题记录
    golang笔记-cache组件应用: freecache/groupcache/golang-lru
    C++优化笔记: -O2/-O3/-ffast-math/SIMD
    linux笔记-查看L1/L2/L3 cache大小
    Dom4j 如何输出 Document 中的内容到文本
    是应该是用 Log 还是 Logger 来定义 Log
    IntelliJ IDEA 如何针对Java 代码快速打印 println
    如何用 Java 判断一个给定的数是不是素数
  • 原文地址:https://www.cnblogs.com/fehdd/p/7001497.html
Copyright © 2020-2023  润新知