我們知道
win
或winNT都是
多線程
的操作系統
在DELPHI
.
中
我們可以充分利用這一特性
編寫出
多線程
的應用程序
對以往在DOS或
位windows下寫程序的人來說
多線程
仍然是陌生的
但如同以前我們從DOS下的單任務過渡到windows
.
下的多任務
如今我們又必須過渡到
多線程
領域
畢竟計算機時代是在不斷發展的
不過
幸運的是
在DELPHI
.
下進行多線程程序設計並不需要我們去學習龐大的WIN
API函數
我們可以利用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的子類TQueryThread
用於在後台執行數據庫查詢
在該類的Create函數中
傳遞了兩個參數Suspended和Query
其中Suspended用於控制線程的運行
如果Suspend為真
TQueryThread類的線程在建立後將立即被懸掛
一直到運行了Resume方法
該線程才會繼續執行
Query參數用於接受一個已經存在的Query控件(在窗體中真正的Query控件)而使它在多線程的情況下運行
Execute是最重要的過程
它是類TQueryThread的執行部分
所有需要在這個多線程類中運行的語句都必須寫在這個過程裡
實際上構造自己的多線程類時
並不需要輸入所有的這些代碼
選擇DELPHI的File菜單下的new選項
再選
TThreadObject
項目
DELPHI就會為你構造基本的程序模塊
然後我們可以根據需要再做相應的修改
進程的執行
假設我們已經建立了一個窗體FORM
窗體中有我們將要使用的查詢控件Query
那麼我們在該單元的USES部分加入上面寫的QuerThrd單元
procedureTForm
.Button
Click(Sender
TObject)
begin
{建立一個運行的進程}
TQueryThread.Create(False
Query
)
end
如果這個過程被執行
那麼窗體中的查詢控件Query
就會自動在多線程的環境下運行查詢
注意TQueryThread類中只有Create而沒有Free
動態建立類以後又忘記刪除是我們常犯的錯誤之一
不過在這裡由於我們指定了FreeOnTerminate(運行完即刪除)為真
所以當Execute裡的語句執行完後
TQueryThread類占據的內存控件將被自動釋放
然而還有一個問題值得我們注意
由於同一時刻可以有多個線程同時運行
那麼我們還必須解決好同步的問題
如果幾個多線程程序之間沒有任何關聯
那麼它們之間也不會有任何沖突
但實際上
可能同時運行幾個多線程的數據庫應用程序
由於需要共享相同的數據庫資源
我們還需要為Query
增加一個Tsession控件
其實
雖然我們也許沒有親自使用過Session控件
但實際上
在所有的數據庫訪問時DELPHI都會自動建立一個臨時的Session控件
使用完後又動態地刪除掉它
在平常的數據庫編程時
用不著我們親自來操作
但在數據庫多線程執行的情況下
為了不相互沖突
我們必須為每個數據庫訪問都定制自己的Session控件
這個步驟非常簡單
我們只需要在窗體中增加一個Session控件
然後給它的屬性
Sessionname
寫一個任意的名字
並再在Query
的
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Ι
)or
(Left+WidthΛParent.Width)then
FXSpeed
ΚFXSpeed*-
if(TopΙ
)or
(Top+HeightΛParent.Height)then
FYSpeed
ΚFYSpeed*-
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)來調用MoveShape過程
實際上
在任何需要操作VCL資源的地方
例如窗體
位圖
都應加入Synchronize調用
執行時我們可以新建一個程序
然後在USES部分加入以上的BncThrd單元
再在它的窗體FORM
上加入兩個Shape控件Shape
和Shape
Shape
可以是一個矩形而Shape
是一個圓
加入以下的代碼就可以讓矩形和圓動起來
procedureTForm
.Button
Click(Sender
TObject)
begin
TBounceThread.Create(False
Shape
)
TBounceThread.Create(False
Shape
)
end
From:http://tw.wingwit.com/Article/program/Delphi/201311/25059.html