引用  http://www.cnblogs.com/del/archive/2011/05/18/2049913.html

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


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

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


procedure MyMethod;
var
  i: Integer;
begin
  for i := to do
  begin
    Form1.Canvas.Lock;
    Form1.Canvas.TextOut(, , 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 := to do
      begin
        Canvas.Lock;
        Canvas.TextOut(, , 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 := to do
      begin
        Canvas.Lock;
        Canvas.TextOut(, , IntToStr(i));
        Canvas.Unlock;
      end;
    end
  );
end; procedure TForm1.Button1Click(Sender: TObject);
begin
  myThread.Start;
end;

delphi CreateAnonymousThread 匿名线程的更多相关文章

  1. TThread.CreateAnonymousThread() 匿名线程对象的应用

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  2. Delphi异步编程:匿名线程与匿名方法

    异步编程,是项目中非常有用的而且常用的一种方法,大多以线程实现. 而Delphi传统方法使用线程略为烦琐,好在其后续版本中,提供一些方法,简化一些操作. 几个概念: 匿名线程:TAnonymousTh ...

  3. 关于Android(Java)创建匿名线程

    Java中创建匿名线程主要集中就三中方式:Thread,Runnable,Handler去实现,下面分别介绍之- 一.通过Thread来创建 new Thread() { public void ru ...

  4. Delphi中匿名方法动态绑定事件

    应恢弘之约,写了一个对其发布的匿名函数动态绑定到事件的封装,代码如下: type TAnonEvent=class public class function Wrap<T1,T2>(On ...

  5. Delphi中的线程类 - TThread详解

    Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...

  6. 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)

    在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但 ...

  7. Delphi中的线程类(转)

    Delphi中的线程类 (转) Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下 ...

  8. 扩展 delphi 线程 使之传递参数.(给匿名线程增加参数)

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

  9. delphi 读网页线程TReadHtmlThread

    读网页,通常是一个耗时操作.故把读网页放入线程是显得比较重要了. 本例用改进后的 TIdhttpEx 加上线程来实现读网页. 它的父类TSimpleThread 在此 本例程源码在此 源码中包含了所有 ...

随机推荐

  1. Java基础91 mysql的用户权限设置问题

    1.概述 1)MySQL数据库中root用户具有最高的权限(超级用户),可以对任何数据库,任何表进行操作. 2)权限账户,只拥有部分权限(CRUD) .例如:只能操作某个数据库的某张表等等. 2.my ...

  2. Cap+Exceptionless实现日志消息发布订阅异常情况日志处理及Cap DashBoard授权处理

    Dashboard介绍 capOptions.UseDashboard(dashoptions => { dashoptions.AppPath = "applicationpath& ...

  3. Channel Allocation HDU1373

    染色问题:相邻不能染同一种颜色 最少需要的颜色的数量=最大团点的数量 #include<bits/stdc++.h> using namespace std; #define N 27 i ...

  4. rabbitMQ的安装(Windows下)

    在公司接触到这一块,信息中间件的使用,在公司没有时间了解的更加深入,只是在简单的使用,这里将深入学习一番. 参考:http://blog.csdn.net/lu1005287365/article/d ...

  5. 002.etcd使用场景

    引用链接: https://blog.csdn.net/linuxheik/article/details/77853119 https://www.cnblogs.com/doscho/p/6221 ...

  6. 关于configure: error: no acceptable C compiler found in $PATH

    Linux系统在安装python3的时候报错: $ ./configure --prefix=/usr/local/python3 checking build system type... x86_ ...

  7. 捕获程序异常之onerror

    问题描述:html5页面在电脑上打开,功能正常,没有报错,一旦嵌进微信或者APP,页面就卡住了,不好排查js问题. 预期结果:手机微信页面功能失效时,开发人员在console面板能明确看到出错信息,出 ...

  8. Ubuntu 16.04 安装搜狗输入法

    安装步骤: 1.去官网下载文件[https://pinyin.sogou.com/linux/] 2.安装deb安装包: sudo dpkg -i 安装包的名字.deb //(如果安装失败,请重复几次 ...

  9. GEEK-2018之隐藏在混乱之中的绝密情报 writeup

    题目如上 打开题目后发现,提示robots 随后提示又需要改一改名字 修改文件名为humans.txt之后发现 有个备份文件,直接访问www.zip就可以下载了 下载打开后如下: 在其中看到了unse ...

  10. python基础之return,参数

    函数的返回值 1.什么是返回值: 返回值是一个函数的处理结果 2.为什么要有返回值 如果需要在程序中拿到函数的处理结果,做进一步的处理,则需要函数必须有返回值 3.函数返回值的应用: 函数的返回值用r ...