DELPHI 多线程(TThread类的实现)

先新建一个普通的工程,再新建一个线程类File>>New>>Othre>>Delphi File>Thread Object,取个名字,DELPHI会自动生成一个单元,我们只需往里简单添加功能代码,和在要使用的单元里实例引用即可。

为了节省篇幅,现把TMyThread类集成主窗体单元里,在主窗体里声明类也是可以的。

 1 unit Unit1;
 2
 3 interface
 4
 5 uses
 6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 7   Dialogs, StdCtrls;
 8
 9 type
10   TMyThread = class(TThread)
11   private
12     { Private declarations }
13   protected
14     procedure Execute; override;
15     procedure Run;
16   end;
17   TForm1 = class(TForm)
18     btn1: TButton;
19     procedure btn1Click(Sender: TObject);
20   private
21     { Private declarations }
22   public
23     { Public declarations }
24   end;
25
26
27
28 var
29   Form1: TForm1;
30
31
32 implementation
33
34 {$R *.dfm}
35
36 var
37   MyThread:TMyThread;
38
39 procedure TMyThread.Execute;
40 begin
41   { Place thread code here }
42   FreeOnTerminate:=True; {加上这句线程用完了会自动注释}
43   Run;
44 end;
45
46 procedure TMyThread.Run;
47 var
48   i:integer;
49 begin
50   for i := 0 to 500000 do
51   begin
52     Form1.Canvas.Lock;
53     Form1.Canvas.TextOut(10,10,IntToStr(i));
54     Form1.Canvas.Unlock;
55   end;
56 end;
57
58 procedure TForm1.btn1Click(Sender: TObject);
59 begin
60   MyThread:=TMyThread.Create(False); {实例化这个类,为False时立即运行,为True时可加MyThread.Resume用来启动}
61 end;

CriticalSection(临界区)

uses SyncObjs;用TCriticalSection类的方法处理。

 1 unit Unit1;
 2
 3 interface
 4
 5 uses
 6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 7   Dialogs, StdCtrls;
 8
 9 type
10   TMyThread = class(TThread)
11   private
12     { Private declarations }
13   protected
14     procedure Execute; override; {执行}
15     procedure Run;  {运行}
16   end;
17   TForm1 = class(TForm)
18     btn1: TButton;
19     lst1: TListBox;
20     procedure btn1Click(Sender: TObject);
21     procedure FormDestroy(Sender: TObject);
22   private
23     { Private declarations }
24   public
25     { Public declarations }
26   end;
27
28
29
30 var
31   Form1: TForm1;
32
33
34 implementation
35
36 {$R *.dfm}
37
38 uses SyncObjs;
39
40 var
41   MyThread:TMyThread;   {声明线程}
42   CS:TCriticalSection; {声明临界体}
43
44
45 procedure TMyThread.Execute;
46 begin
47   { Place thread code here }
48   FreeOnTerminate:=True; {加上这句线程用完了会自动注释}
49   Run;     {运行}
50 end;
51
52 procedure TMyThread.Run;
53 var
54   i:integer;
55 begin
56   CS.Enter;  {我要用了,其它人等下}
57   for i := 0 to 100 - 1 do
58   begin
59     Form1.lst1.Items.Add(IntToStr(i));
60   end;
61   CS.Leave;  {我用完了,下一个}
62 end;
63
64 procedure TForm1.btn1Click(Sender: TObject);
65 begin
66   CS:=TCriticalSection.Create;     {实例化临界体}
67   MyThread:=TMyThread.Create(False); {实例化这个类,为False时立即运行,为True时可加MyThread.Resume用来启动}
68   MyThread:=TMyThread.Create(False);
69   MyThread:=TMyThread.Create(False);
70 end;
71
72
73 procedure TForm1.FormDestroy(Sender: TObject);
74 begin
75   CS.Free;{释放临界体}
76 end;
77
78 end.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

等待函数 PS:
function WaitForSingleObject(
hHandle: THandle; {要等待的对象句柄}
dwMilliseconds: DWORD {等待的时间, 单位是毫秒}
): DWORD; stdcall; {返回值如下:}

WAIT_OBJECT_0 {等着了, 本例中是: 等的那个进程终于结束了}
WAIT_TIMEOUT {等过了点(你指定的时间), 也没等着}
WAIT_ABANDONED {好不容易等着了, 但人家还是不让咱执行; 这一般是互斥对象}

//WaitForSingleObject 的第二个参数一般给常数值 INFINITE, 表示一直等下去, 死等.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

时间: 2024-08-15 11:05:43

DELPHI 多线程(TThread类的实现)的相关文章

转:学习笔记: Delphi之线程类TThread

学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时间. TThread-简单的开始 在Delphi的VCL中封装了一个TThread类用于多线程的开发,这样比较符合面向对象的思想,同时又可以提

Delphi中线程类TThread 实现多线程编程

作者:Rogee出处:Http://Rogee.cnblogs.com/心得:BLOG是什么,它是一个记录学习过程的东西 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以

多核时代下的多线程编程----帮大家读懂TThread类

转载地址: http://redboy136.blog.163.com/blog/static/107188432201411250111478/ TThread类在Delphi的RTL里算是比较简单的类,类成员也不多,类属性都很简单明白,本文将只对几个比较重要的类成员方法和唯一的事件:OnTerminate作详细分析. 首先就是构造函数: constructor TThread.Create(CreateSuspended: Boolean); begin inherited Create;

Delphi多线程编程(1)--先入门再说

转载:万一的博客 多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样). 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个 procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:= 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; 上面程序运

delphi 多线程编程

开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi

转:学习笔记:delphi多线程学识

学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: 1.临界区 申明一个临界资源 FLock : TRTLCriticalSection; 先初化一个临界资源对象 InitializeCriticalSection(FLock) 销毁临界资源对象 DeleteCriticalSection(FLock) proced

delphi 多线程 动态创建ADO

delphi 在多线程中动态连接ADO控件 异常:exception class EOleSysError with message '尚未调用CoInitialize' 如果是使用多线程的话那就在 Execute事件的开头加上 CoInitialize(nil); 结尾加上CoUninitialize() unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo

Delphi的TThread中的FreeOnTerminate成员

类 Create 了就要 Free;  但 TThread(的子类) 有特殊性, 很多时候我们不能确定新建的线程什么时候执行完(也就是什么时候该释放);  如果线程执行完毕自己知道释放就好了, 所以 TThread 给了一个布尔属性 FreeOnTerminate, 如果为 True, 线程执行完毕后就会自释放. 首先看下面的例程 type TMyThread = class(TThread) protected procedure Execute; override; end; procedu

Delphi多线程编程(12)--多线程同步之Semaphore(信号对象)

转载自:万一的博客 之前已经有了两种线程同步的方法: CriticalSection(临界区)和Mutex(互斥)吗,这两种同步方法差不多,只是作用域不同 CriticalSection类似于只有一个蹲位的公共厕所,只能一个个地进 Mutex 对象类似于接力赛中的接力棒,某一时刻只能有一个人持有,谁拿着谁跑 什么是Semaphore(信号或叫信号量)呢? 譬如到银行办业务.或者到车站买票,原来只有一个服务员,不管有多少人排队等候,业务只能一个个地来 假如增加业务窗口,可以同时受理几个业务呢? 这

delphi 多线程

CoInitialize(nil); //调用COM,需要初始化 HThread: THandle; ID: DWord; HThread:= CreateThread(nil, 0, @start, nil, 0, ID); ResumeThread(HThread_1); //返回值为1,继续线程 SuspendThread(HThread_1); //挂起线程 //写入INI配置,决定是否暂停线程while True do begin cap:= IniFile.ReadString('U