DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xjhbbs
今日帖子: 9
在线用户: 18
导航: 论坛 -> 论坛精华贴 斑竹:liumazi,iamdream  
作者:
男 babyluoyi (赵子龙) ★☆☆☆☆ -
盒子活跃会员
2003/6/20 18:10:40
标题:
帮我解释一个名词:多线程!!!!!!!! 浏览:4043
加入我的收藏
楼主: 大虾们,多线程是什么意思哟!怎么做?用在什么地方?有怎么样的作用???
能够给我解释一下吗???谢谢啰!!!!!!!!!

----------------------------------------------
好好学习,天天向上!
作者:
男 boy (阿門) ★☆☆☆☆ -
盒子活跃会员
2003/6/20 18:15:40
1楼: DELPHI下的多線程程序設計 
作 者:microrain
類 別:Delphi
發布時間:2002-2-27 8:39:23
我們知道,win95或winNT都是“多線程”的操作繫統,在DELPHI 2﹒0中,我們可以充分利用這一特性,編寫出“多線程”的應用程序。 
對以往在DOS或16位windows下寫程序的人來說,“多線程”仍然是陌生的,但如同以前我們從DOS下的單任務過渡到windows3﹒1下的多任務,如今我們又必須過渡到“多線程”領域,畢竟計算機時代是在不斷發展的。不過,幸運的是,在DELPHI2﹒0下進行多線程程序設計並不需要我們去學習龐大的WIN32API函數,我們可以利用DELPHI下標準的多線程類TThread來完成我們的工作。 
TThread是一個abstract(抽像)類,也就是說,並不需要根據TThread來聲明變量(而且根據TThread聲明的變量也是完全無用),我們要做的是把TThread作為基類,用繼承的形式來生成子類。實際上,根據TThread來寫多線程應用程序是非常容易的。 
下面就是一個基本的繼承TThread生成的多線程類。 
QuerThrd﹒Pas 
unitQuerThrd; 
interface 
uses 
Classes,DBTables; 
type 
TQueryThreadΚclass(TThread) 
private 
fQuery:tQuery; 
protected 
procedureExecute;override; 
public 
constructorCreate(Suspended:Boolean;Query:TQuery); 
end; 
implementation 
constructor 
TQueryThread﹒Create(Suspended:Boolean;Query:TQuery); 
begin 
inheritedCreate(Suspended); 
fQuery:ΚQuery; 
FreeOnTerminate:ΚTrue; 
end; 
procedureTQueryThread﹒Execute; 
begin 
fQuery﹒Open; 
end; 
end﹒ 
在上面這個簡單的例子中,我們構造了一個TThread的子類TQuery Thread,用於在後臺執行數據庫查詢。在該類的Create函數中,傳遞了兩個參數Suspended和Query,其中Suspended用於控制線程的運行,如果Suspend為真,TQueryThread類的線程在建立後將立即被懸掛,一直到運行了Resume方法,該線程纔會繼續執行,Query參數用於接受一個已經存在的Query控件(在窗體中真正的Query控件)而使它在多線程的情況下運行。Execute是最重要的過程,它是類TQueryThread的執行部分,所有需要在這個多線程類中運行的語句都必須寫在這個過程裡。 
實際上構造自己的多線程類時,並不需要輸入所有的這些代碼,選擇DELPHI的File菜單下的new選項,再選“TThreadObject”項目,DELPHI就會為你構造基本的程序模塊。然後我們可以根據需要再做相應的修改。 
進程的執行: 
假設我們已經建立了一個窗體FORM1,窗體中有我們將要使用的查詢控件Query1。那麼我們在該單元的USES部分加入上面寫的QuerThrd單元。 
procedureTForm1﹒Button1Click(Sender:TObject); 
begin 
?建立一個運行的進程? 
TQueryThread﹒Create(False,Query1); 
end; 
如果這個過程被執行,那麼窗體中的查詢控件Query1就會自動在多線程的環境下運行查詢。注意TQueryThread類中隻有Create而沒有Free,動態建立類以後又忘記刪除是我們常犯的錯誤之一,不過在這裡由於我們指定了FreeOnTerminate(運行完即刪除)為真,所以當Execute裡的語句執行完後,TQueryThread類占據的內存控件將被自動釋放。 
然而還有一個問題值得我們注意,由於同一時刻可以有多個線程同時運行,那麼我們還必須解決好同步的問題,如果幾個多線程程序之間沒有任何關聯,那麼它們之間也不會有任何衝突。但實際上,可能同時運行幾個多線程的數據庫應用程序,由於需要共享相同的數據庫資源,我們還需要為Query1增加一個Tsession控件。 
其實,雖然我們也許沒有親自使用過Session控件,但實際上,在所有的數據庫訪問時DELPHI都會自動建立一個臨時的Session控件,使用完後又動態地刪除掉它。在平常的數據庫編程時,用不著我們親自來操作,但在數據庫多線程執行的情況下,為了不相互衝突,我們必須為每個數據庫訪問都定制自己的Session控件。這個步驟非常簡單,我們隻需要在窗體中增加一個Session控件,然後給它的屬性“Sessionname”寫一個任意的名字,並再在Query1的“Sessionname”中寫一個相同的名字。這樣我們的數據庫程序就安全了。 
另一類需要解決同步問題的是那些對VCL資源進行操作的程序,這類的程序非常多,好在解決的方法也非常簡單。 
我們可以看下面這樣一個程序: 
unitBncThrd; 
interface 
uses 
WinProcs,Classes,Graphics,ExtCtrls; 
type 
TBounceThreadΚclass(TThread) 
private 
FShape:TShape; 
FXSpeed:Integer; 
FYSpeed:Integer; 
procedureMoveShape; 
protected 
procedureExecute;override; 
public 
constructorCreate(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer); 
propertyShape:TShapereadFShape; 
end; 
implementation 
procedureTBouad﹒MoveShape; 
var 
MaxHeight,MaxWidth:Integer; 
begin 
withFShapedo 
begin 
Left:ΚLeft+FXSpeed; 
Top:ΚTop+FYSpeed; 
if(LeftΙ0)or 
(Left+WidthΛParent﹒Width)then 
FXSpeed:ΚFXSpeed*-1; 
if(TopΙ0)or 
(Top+HeightΛPar ent﹒Height)then 
FYSpeed:ΚFYSpeed*-1; 
end; 
end; 
procedureTBounceThread﹒Execute; 
begin 
WhilenotTerminateddo 
begin 
Synchronize(MoveShape); 
end; 
end; 
constructorTBounceThread﹒Create(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer); 
begin 
inheritedCreate(Suspended); 
FShape:ΚShape; 
FXSpeed:ΚXSpeed;?X軸走向的速度? 
FYSpeed:ΚYSpeed;?Y軸走向的速度? 
FreeOnTerminate:ΚTrue; 
end; 
end﹒ 
這是一個多線程的踫踫球遊戲,你可以有多個不同的球,它們分屬不同的線程,各自獨立的在屏幕上踫撞。顯然,由於多個球運行的顯示會同時操作VCL資源,為了安全,我們在Execute過程中的執行部分加入了Synchronize(MoveShape)來調用Move Shape過程,實際上,在任何需要操作VCL資源的地方,例如窗體、位圖,都應加入Synchronize調用。 
執行時我們可以新建一個程序,然後在USES部分加入以上的BncThrd單元,再在它的窗體FORM1上加入兩個Shape控件Shape1和Shape2,Shape1可以是一個矩形而Shape2是一個圓。加入以下的代碼就可以讓矩形和圓動起來。 
procedureTForm1﹒Button1Click(Sender:TObject); 
begin 
TBounceThread﹒Create(False,Shape1,1,2); 
TBounceThread﹒Create(False,Shape2,2,3); 
end;
----------------------------------------------
Delphi開發◆伺服器架設◆免安裝APACHE,PHP,CGI Perl, MYSQL ★
作者:
男 babyluoyi (赵子龙) ★☆☆☆☆ -
盒子活跃会员
2003/6/20 18:22:27
2楼: 看起来很复杂哟!
啷个办撒!!

----------------------------------------------
好好学习,天天向上!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行58.59375毫秒 RSS