标签:
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, 表示一直等下去, 死等.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
标签:
原文地址:http://www.cnblogs.com/chaosc/p/5819178.html