DELPHI下的多執行緒程式設計(1) (轉)
DELPHI下的多執行緒程式設計(1) (轉)[@more@]下的多執行緒設計(1)
我們知道,win95或winNT都是“多執行緒”的操作,在DELPHI 2.0中,我們可以充分利用這一特性,編寫出“多執行緒”的應用程式。
對以往在DOS或16位下寫程式的人來說,“多執行緒”仍然是陌生的,但如同以前我們從DOS下的單任務過渡到windows3.1下的多工,如今我們又必須過渡到“多執行緒”領域,畢竟時代是在不斷髮展的。不過,幸運的是,在DELPHI2.0下進行多執行緒程式設計並不需要我們去學習龐大的,我們可以利用DELPHI下標準的多執行緒類TThread來完成我們的工作。
TThread是一個abstract(抽象)類,也就是說,並不需要根據TThread來宣告變數(而且根據TThread宣告的變數也是完全無用),我們要做的是把TThread作為基類,用繼承的形式來生成子類。實際上,根據TThread來寫多執行緒應用程式是非常容易的。
下面就是一個基本的繼承TThread生成的多執行緒類。
QuerThrd.Pas
unitQuerThrd;
interface
uses
Classes,Tables;
type
TQueryThreadΚclass(TThread)
private
fQuery:tQuery;
protected
procedureExecute;overr;
public
constructorCreate(Suspended:Boolean;Query:TQuery);
end;
implementation
constructor
TQueryThread.Create(Suspended:Boolean;Query:TQuery);
begin
inheritedCreate(Suspended);
fQuery:ΚQuery;
FreeOnTenate:Κ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選項,再選“TThread”專案,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;
我們知道,win95或winNT都是“多執行緒”的操作,在DELPHI 2.0中,我們可以充分利用這一特性,編寫出“多執行緒”的應用程式。
對以往在DOS或16位下寫程式的人來說,“多執行緒”仍然是陌生的,但如同以前我們從DOS下的單任務過渡到windows3.1下的多工,如今我們又必須過渡到“多執行緒”領域,畢竟時代是在不斷髮展的。不過,幸運的是,在DELPHI2.0下進行多執行緒程式設計並不需要我們去學習龐大的,我們可以利用DELPHI下標準的多執行緒類TThread來完成我們的工作。
TThread是一個abstract(抽象)類,也就是說,並不需要根據TThread來宣告變數(而且根據TThread宣告的變數也是完全無用),我們要做的是把TThread作為基類,用繼承的形式來生成子類。實際上,根據TThread來寫多執行緒應用程式是非常容易的。
下面就是一個基本的繼承TThread生成的多執行緒類。
QuerThrd.Pas
unitQuerThrd;
interface
uses
Classes,Tables;
type
TQueryThreadΚclass(TThread)
private
fQuery:tQuery;
protected
procedureExecute;overr;
public
constructorCreate(Suspended:Boolean;Query:TQuery);
end;
implementation
constructor
TQueryThread.Create(Suspended:Boolean;Query:TQuery);
begin
inheritedCreate(Suspended);
fQuery:ΚQuery;
FreeOnTenate:Κ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選項,再選“TThread”專案,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;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-975750/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DELPHI下的多執行緒程式設計(2) (轉)執行緒程式設計
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計
- Linux下的多執行緒程式設計(轉)Linux執行緒程式設計
- 多執行緒程式設計(轉)執行緒程式設計
- C#多執行緒程式設計(1):執行緒的啟動C#執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- Linux下的多執行緒程式設計Linux執行緒程式設計
- python多執行緒程式設計1— python對多執行緒的支援Python執行緒程式設計
- .NET多執行緒程式設計(4):執行緒池和非同步程式設計 (轉)執行緒程式設計非同步
- 多執行緒程式設計執行緒程式設計
- Java程式中的多執行緒(1)(轉)Java執行緒
- iOS多執行緒程式設計總結(下)iOS執行緒程式設計
- Linux系統下的多執行緒程式設計入門(轉)Linux執行緒程式設計
- Java多執行緒程式設計入門(轉)Java執行緒程式設計
- Posix執行緒程式設計指南(1)-執行緒建立與取消 (轉)執行緒程式設計
- java多執行緒程式設計chap1-2Java執行緒程式設計
- Java多執行緒設計模式(1)Java執行緒設計模式
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Boost多執行緒程式設計執行緒程式設計
- UNIX多執行緒程式設計執行緒程式設計
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 深入淺出Java多執行緒程式設計(轉)Java執行緒程式設計
- python的學習(七)----多執行緒程式設計(1)Python執行緒程式設計
- 擴充套件Delphi的執行緒同步物件(1) (轉)套件執行緒物件
- Linux下應用程式開發:QT中的多執行緒程式設計(轉)LinuxQT執行緒程式設計
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- POSIX執行緒程式設計起步(1)-Hello World (轉)執行緒程式設計
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- python 多執行緒程式設計Python執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- GCD 與多執行緒程式設計GC執行緒程式設計
- IOS多執行緒程式設計:概述iOS執行緒程式設計
- C#多執行緒程式設計C#執行緒程式設計