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;
Delphi 的多线程相关推荐
- Delphi中多线程用Synchronize实现VCL数据同步显示
概述: VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现.在类的Ex ...
- Delphi关于多线程同步的一些方法
(注:本文为转载 http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html) 线程是进程内一个相对独立的.可调度的执行 ...
- Delphi实现多线程
线程是进程内一个相对独立的.可调度的执行单元.一个应用可以有一个主线程,一个主线程可以有多个子线程,子线程还可以有自己的子线程,这样就构成了多线程应用了.由于多个线程往往会同时访问同一块内存区域,频繁 ...
- 关于delphi中多线程采用定时器的做法
delphi中的提供了一个tthread的多线程类,开发者可以根据自身的需要,定制相应功能的多线程,而定时器在多线程中有很广泛的应用,在这里,只说关于waitforsingleobject来做定时器的 ...
- delphi的多线程编程
多线程的基本概念 (转) win 98/nt/2000/xp 是个多任务操作系统,也就是:一个进程可以划分为多个线程, 每个线程轮流占用cpu 运行时间和资源,或者说,把cpu 时间划成片,每个片分给 ...
- Delphi的多线程开发实例
在软件开发的过程中,多线程的开发应用有着极为重要的位置,使用多线程可以让软件系统 能够并行操作.同时也能提高其运行效率.作为软件开发人员的必修课之一,多线程的熟练 运用可以让软件系统有更佳的性能表现. ...
- Delphi Thread 多线程编程(6)
3. 线程中常见的问题. 1) 回调函数引起的死锁. A回调线程B中的函数,而在线程B中,再去对线程A进行操作(比如删除A).发生的现象:程序死掉. 2) 使用同一资源未加保护引起问题. A和B同时去 ...
- delphi android 多线程,Delphi实现简单多线程
对于我这种Delphi渣渣选手来说,整这么一个破玩意儿真不好搞,网上找半天示例还找不到一个纯净版的实现,找到好多示例实现起来的也各不一样,于是乎就有了这篇文章~~如果写过java的swing程序就很清 ...
- delphi android 多线程,Delphi中使用TThread进行多线程开发总结
最近项目的Demo开发使用Delphi 2010,其中使用了多线程开发技术 这里采用VCL的TThread类完成多线程开发,直接使用CreateThread的办法之前用过很多,这里就当练习,试试采用T ...
- 现在, Delphi 的多线程已经非常易用了!
先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): {自定义方法: 在窗体上绘制...} procedure MyMethod; vari: Integer; beginfor i ...
最新文章
- 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
- python爬虫案例-Python爬虫案例集合
- AtCoder Grand Contest 015
- kali linux 截图位置,Kali Linux中使用截图工具
- spring编程式事务控制
- 微软Azure storage account的path值代表什么含义
- CentOS 7 firewalld使用简介
- vue.js 入门,简介
- rfcv函数实现_OpenSSL AES_ctr128_encrypt()作为伪随机函数在RFC3711(SRTP)
- pkg-config --cflags --libs
- [详解]Linux的目录里都装些啥??
- 小米怎么设置语音识别权限 | 手游网游页游攻略大全
- 分模块开发创建service子模块——(八)
- open sl java audio_webrtc学习(二): audio_device之opensles
- emwin添加图标和图片
- 一篇文章轻松搞定SpringSecurity权限框架!
- 什么是知识图谱?通俗易懂
- 百度高级搜索指令大全
- Phpcms黄页yp如何添加企业模板
- 一台 液晶显示器台式计算机总耗电,一台配置液晶显示器的台式计算机总耗电量为()。...