zoukankan      html  css  js  c++  java
  • Delphi 的多线程使用已经很简单了

    先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体):

    {自定义方法: 在窗体上绘制...}
    procedure MyMethod;
    var
      i: Integer;
    begin
      for i := 0 to 500000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(10, 10, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
    end;
    
    {调用上面的自定义方法}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyMethod;
    end;
    

     修改为多线程(只修改一行代码):

    procedure MyMethod;
    var
      i: Integer;
    begin
      for i := 0 to 500000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(10, 10, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TThread.CreateAnonymousThread(MyMethod).Start; //!!!
    end;
    

     代码分析:

    1、TThread 现在增加了许多 class 方法(直接通过类名调用的方法), TThread.CreateAnonymousThread() 就是比较有用的一个.

    2、顾名思义, CreateAnonymousThread 是建立匿名线程对象, 它的参数是我们需要在线程中执行的方法.

    3、但 CreateAnonymousThread 建立线程后是挂起的, 需要手动运行它; 后面的 Start 方法就是用来唤醒线程的.

    4、(以前)唤醒线程还可以使用 Resume 方法或 Suspended 属性(Suspended := False;); 但它们即将被废弃了, 现在应使用 Start 来启动线程.



    CreateAnonymousThread 的参数类型 TProc 是匿名方法(reference), 所以代码可以简写为:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TThread.CreateAnonymousThread( //直接写入方法体
        procedure
        var
          i: Integer;
        begin
          for i := 0 to 500000 do
          begin
            Canvas.Lock;
            Canvas.TextOut(10, 10, IntToStr(i));
            Canvas.Unlock;
          end;
        end //此处无分号
      ).Start;
    end;

    延时执行:

    var
      myThread: TThread;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      myThread := TThread.CreateAnonymousThread(
        procedure
        var
          i: Integer;
        begin
          for i := 0 to 500000 do
          begin
            Canvas.Lock;
            Canvas.TextOut(10, 10, IntToStr(i));
            Canvas.Unlock;
          end;
        end  //这里没有分号 ;
      );
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      myThread.Start;
    end;

     参考这个例子

     https://blog.csdn.net/yegshun/article/details/78139536 


  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/westsoft/p/9904870.html
Copyright © 2011-2022 走看看