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

{自定义方法: 在窗体上绘制…}
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;

Delphi 的多线程相关推荐

  1. Delphi中多线程用Synchronize实现VCL数据同步显示

    概述: VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现.在类的Ex ...

  2. Delphi关于多线程同步的一些方法

    (注:本文为转载  http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html) 线程是进程内一个相对独立的.可调度的执行 ...

  3. Delphi实现多线程

    线程是进程内一个相对独立的.可调度的执行单元.一个应用可以有一个主线程,一个主线程可以有多个子线程,子线程还可以有自己的子线程,这样就构成了多线程应用了.由于多个线程往往会同时访问同一块内存区域,频繁 ...

  4. 关于delphi中多线程采用定时器的做法

    delphi中的提供了一个tthread的多线程类,开发者可以根据自身的需要,定制相应功能的多线程,而定时器在多线程中有很广泛的应用,在这里,只说关于waitforsingleobject来做定时器的 ...

  5. delphi的多线程编程

    多线程的基本概念 (转) win 98/nt/2000/xp 是个多任务操作系统,也就是:一个进程可以划分为多个线程, 每个线程轮流占用cpu 运行时间和资源,或者说,把cpu 时间划成片,每个片分给 ...

  6. Delphi的多线程开发实例

    在软件开发的过程中,多线程的开发应用有着极为重要的位置,使用多线程可以让软件系统 能够并行操作.同时也能提高其运行效率.作为软件开发人员的必修课之一,多线程的熟练 运用可以让软件系统有更佳的性能表现. ...

  7. Delphi Thread 多线程编程(6)

    3. 线程中常见的问题. 1) 回调函数引起的死锁. A回调线程B中的函数,而在线程B中,再去对线程A进行操作(比如删除A).发生的现象:程序死掉. 2) 使用同一资源未加保护引起问题. A和B同时去 ...

  8. delphi android 多线程,Delphi实现简单多线程

    对于我这种Delphi渣渣选手来说,整这么一个破玩意儿真不好搞,网上找半天示例还找不到一个纯净版的实现,找到好多示例实现起来的也各不一样,于是乎就有了这篇文章~~如果写过java的swing程序就很清 ...

  9. delphi android 多线程,Delphi中使用TThread进行多线程开发总结

    最近项目的Demo开发使用Delphi 2010,其中使用了多线程开发技术 这里采用VCL的TThread类完成多线程开发,直接使用CreateThread的办法之前用过很多,这里就当练习,试试采用T ...

  10. 现在, Delphi 的多线程已经非常易用了!

    先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): {自定义方法: 在窗体上绘制...} procedure MyMethod; vari: Integer; beginfor i ...

最新文章

  1. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
  2. python爬虫案例-Python爬虫案例集合
  3. AtCoder Grand Contest 015
  4. kali linux 截图位置,Kali Linux中使用截图工具
  5. spring编程式事务控制
  6. 微软Azure storage account的path值代表什么含义
  7. CentOS 7 firewalld使用简介
  8. vue.js 入门,简介
  9. rfcv函数实现_OpenSSL AES_ctr128_encrypt()作为伪随机函数在RFC3711(SRTP)
  10. pkg-config --cflags --libs
  11. [详解]Linux的目录里都装些啥??
  12. 小米怎么设置语音识别权限 | 手游网游页游攻略大全
  13. 分模块开发创建service子模块——(八)
  14. open sl java audio_webrtc学习(二): audio_device之opensles
  15. emwin添加图标和图片
  16. 一篇文章轻松搞定SpringSecurity权限框架!
  17. 什么是知识图谱?通俗易懂
  18. 百度高级搜索指令大全
  19. Phpcms黄页yp如何添加企业模板
  20. 一台 液晶显示器台式计算机总耗电,一台配置液晶显示器的台式计算机总耗电量为()。...

热门文章

  1. 反射型XSS漏洞基础
  2. 【调剂】北方民族大学计算机科学与工程学院2021年考研调剂信息
  3. 解魔方机器人系列(三)软件控制及整机测试
  4. 美国地质调查局SRTM--30米DEM数据
  5. NOIP2011 聪明的质检员 题解
  6. 一次性搞懂dBSPL、dBm、dBu、dBV、dBFS的区别!
  7. resource.h文件和项目的.rc资源的关系
  8. 安卓定时获得wifi强度编程
  9. Stewart平台运动学
  10. 【Springboot学习笔记】SpringBoot+Mybatis+Thymeleaf+Layui数据表单从零开始实现按条件模糊分页查询的方法