本文整理自网络,侵删。
第一节:初识多线程 1.为什么要学习多线程编程? 多线程(多个线程同时运行)编程,亦可称之为异步编程。有了多线程,主界面才不会因为耗时代码而造成“假死“状态。有了多线程,才能使多个任务同时执行,最大化利用CPU资源,提高效率。在安卓编程中,要求必须是多线程,主界面中的代码只要耗时几秒钟,就会触发 ANR 错误。多线程编程才是工作中的常态。多线程是必须掌握的!越早越好! 2.网络上 delphi 多线程 Demo 的误区 采用 API 来实现多线程。难度太高,尤其是用指针来传参数,不适合初学者。用访问界面来举例,出发点就错了。多线程最不擅长的就是操作UI。网上流行的 demo 就是弄个大循环,再来一个 TextOut 输出。结果又不得不加上 canvas.Lock, 真是够折腾。 3.主线程的定义 假设,一个EXE程序,拥有一个 FrmMain (TForm)。FrmMain 上面有一个 Button1 (TButton) ,一个Edit1 (TEdit)以及一个 Timer1 (TTimer) 。那么,我们通常把界面(UI)定义为主线程,即 FrmMain 就是主线程。Button1 的 OnClick 事件中的代码运行于主线程时空。(本教程均统一定义线程时空一词)使用者在 Edit1 中的输入操作也是主线程时空。Timer1 的 OnTimer 事件中的代码也运行于主线程时空。请注意:初学者最容易把 OnTimer 事件误认为是多线程时空。 4.普通编程与多线程编程的区别 // 普通编程function Accumulate(num:integer):integer;var i:integer;begin result:=0; if num<1 then exit; for i:=1 to num do result:=result+i;end;// 在 Button1 的 OnClick 事件中编写如下代码:var n,Total:integer;begin n:=100; Total:=Accumelate(n); // 等待计算结果,假设计算需要5分钟,此处就得等待5分钟。 // 这5分钟内,界面是无法访问的,是假死的。 // 计算完成,得到结果 Total=5050; DoSomeThing; //接着执行此句。end; // 多线程编程,此为计算线程类unit uAccumulation;interfaceuses Classes;type TAccumulationThread = class; TOnAccumulated = procedure(Sender: TAccumulationThread) of object; TAccumulationThread = class(TThread) protected procedure Execute; override; public Num: integer; Total: integer; OnAccumulated: TOnAccumulated; end; implementation procedure TAccumulationThread.Execute;var i: integer;begin inherited; Total := 0; if Num > 0 then begin for i := 1 to Num do Total := Total + i end; // 当计算完成后,就调用 OnAccumulated 通知调用者 if Assigned(OnAccumulated) then OnAccumulated(self);end;end. 写代码请用英语命名,用正确的单词,时态。切记,非常重要! // 调用多线程// 在FrmMain 中定义 OnAccumulated 事件函数Procedure TFrmMain.OnAccumulated(Sender:TAccumulationThread);var sum:integer;begin // 当计算完成时,计算线程就调用本事件函数。 // 我们在这里就得到了计算结果 sum:=Sender.Total; // 因为这里是线程时空,不能直接把 sum 的值显示到界面上。 // 如何正确显示,将下一章节中讲解。end; // 在Button1 的OnClick 事件中编写下面的代码var thd:TAccumulationThread;begin // 此处为主线程时空。 thd:=TAccumuationThread.Create(true); thd.OnAccumulated=Self.OnAccumulated; // Self 指是 FrmMain. thd.Num:=100; thd.Start; //启动线程,在线程时空中执行 Execute 中的代码。 // start 立即返回并执行下一条代码 DoSomeThing; // 此时,就有两个线程在同时执行。 // 1.主线程,也就是此处运行的时代码。 // 2.计算线程,也就是 Execute 中的代码,这些代码此时运行于多线程时空。 // 由于是两个线程并行在执行,故此处 DoSomeThing 马上可以执行。 // 界面也不会假死 DoSomeThing;end; 通过比较,似乎看出多线程要写更多的代码?要用事件来传递结果来给调用者?其实都不然,这两点均是面向对象(OO)写法,与线程类无关。最大的不同是:异步执行,把耗时的计算任务放了入另一个线程时空! 多线程带来了效率,同时也带来了更多的麻烦。欲知后事如何,且听下回分解。更多学习:http://www.cnblogs.com/lackey/p/6297115.html
相关阅读 >>
Delphi idhttp中设置非标准头信息和读写cookie
Delphi 一组数据,按由大到小进行排序,并输出最大值与最小值
更多相关阅读请进入《Delphi》频道 >>