TThread是一個抽象類,可以創(chuàng)建幾個獨立的線程。
DELPHI多線程同步的一些處理方案大家可以參考:http://m.elephantinaurance.com/html/16747_1.html
類關(guān)系 TObject
在一個多線程的應(yīng)用程序中創(chuàng)建一個TThread的后子類代表一個線程。每一新子類的TThread對象的實例是一個新的線程。從TThread派生的多線程實例可以構(gòu)成Delphi的多線程應(yīng)用程序。
當一個應(yīng)用程序運行時,應(yīng)用程序就被載入內(nèi)存準備執(zhí)行。此時,它成為包含一個或多個線程的進程,每個線程含有數(shù)據(jù)、代碼和系統(tǒng)資源。線程執(zhí)行應(yīng)用程序的部分內(nèi)容,并由系統(tǒng)分配CPU時間。同一進程的所有線程共享同一地址空間,可以訪問進程的全局變量。線程通過以下工作改善應(yīng)用的性能:管理多通信設(shè)備的輸入。
區(qū)分任務(wù)的優(yōu)先級。優(yōu)先級高的處理緊急的任務(wù)。優(yōu)先級低的處理其他任務(wù)。
以下是使用線程的一些建議:
同時跟蹤太多的線程消耗CPU時間。對單處理器系統(tǒng),一個進程最多有16個線程。
當多個線程更新相同的資源時,應(yīng)使線程同步以避免沖突。
大多數(shù)訪問VCL對象和更新窗體的方法必須從主VCL線程內(nèi)部調(diào)用。
以下為創(chuàng)建和使用一個新線程的過程:
(1)單擊File|New|Thread菜單項,創(chuàng)建一個包含對象的新單元,該對象源于TThread類。
(2)定義新線程對象和Create方法。
(3)通過插入線程執(zhí)行時需要的代碼定義線程對象和Execute方法。
(4)將使用VCL組件的任何調(diào)用傳遞給Synchronize方法,以避免多線程沖突。
屬性列表
FreeOnTerminate 線程終止時該對象是否自動刪除
Handle 包含線程句柄
Priority 確定該線程相對于進程中其他線程的優(yōu)先級
ReturnValue 返回線程值
Suspended 指示一線程是否被掛起
Terminated 表明線程被要求終止
ThreadID 標識貫穿系統(tǒng)的線程
方法列表
~TThread 刪除線程對象并釋放其戰(zhàn)用的內(nèi)存空間
DoTerminate 產(chǎn)生一個OnTerminate事件
Execute 提供包含線程執(zhí)行時所需代碼的抽象方法
Resume 重新執(zhí)行一個掛起的線程
Suspend 掛起一個運行中的線程
Synchronize 在主VCL線程中執(zhí)行Method
Terminate 將Ternimated屬性設(shè)置為True通知線程終止
TThread 創(chuàng)建一個線程對象的實例
WaitFor 等待線程終止并返回ReturnValue屬性值
事件列表
OnTerminateExecute 方法已返回且該線程被刪除前發(fā)生
屬性
TThread::FreeOnTerminate
__property bool FreeOnTerminate = {read=FFreeOnTerminate,write=FFreeOnTerminate,nodefault};
確定當線程終止時,該線程對象是否自動刪除。
FreeOnTerminate默認值為False,線程對象必須在代碼中顯示刪除。
包含線程句柄。
當調(diào)用Win32API函數(shù)處理線程時,使用Handle.
TThread::Priority
__property TThreadPriority Priority = {read=GetPriority,write=SetPriority,nodefault};
確定該線程相對于進程中其他線程的優(yōu)先級。
Priority屬性為一枚舉類型,其默認為tpNormal.
TThreadPriority類型定義了TThread組件的Priority屬性的可能值,如下表所述。Windows根據(jù)優(yōu)先級確定每一個線程的CPU周期。
_____________________________________________________________________
值 含義
_____________________________________________________________________
tpIdle 只有當系統(tǒng)空閑時該線程執(zhí)行
tpLowest 線程優(yōu)先級比正常低2點
tpLower 線程優(yōu)先級比正常低1點
tpNormal 線程優(yōu)先級為正常值
tpHigher 線程優(yōu)先級比正常高1點
tpHighest 線程優(yōu)先級比正常高2點
tpTimeCritical 線程優(yōu)先級最高
TThread::ReturnValue
__property int ReturnValue = {read=FReturnValue,write=FReturnValue,nodefault};
返回線程值。
使用ReturnValue應(yīng)用為其他線程指示其成功/失敗或數(shù)字結(jié)果/輸出。WaitFor方法返回存儲在ReturnValue中的值。
TThread::Suspended
__property bool Suspended = {read=FSuspended,write=SetSuspended,nodefault};
指示一線程是否被掛起。
除非重新執(zhí)行,否則被掛起的線程不會繼續(xù)執(zhí)行。若將Suspended設(shè)置為True將掛起一個線程;若設(shè)置為False,則繼續(xù)執(zhí)行該線程。
TThread::Terminated
__property bool Terminated = {read=FTerminated,nodefault};
表明線程被要求終止。Terminate方法將Terminated屬性設(shè)置為True。
線程的Execute方法和任何Execute調(diào)用的方法將周期性地檢查Terminated,當其為True時,將終止執(zhí)行。
TThread::ThreadID
__property int ThreadID = {read=FhreadID,nodefault};
標識貫穿系統(tǒng)的線程。
當調(diào)用Win32API函數(shù)處理線程時,ThreadID將十分有用。
注意:ThreadID與Handle屬性不同。
方法
TThread::~TThread
__fastcall virvual ~TThread(void);
刪除線程對象并釋放其戰(zhàn)勝的內(nèi)存空間。
在應(yīng)用中不要調(diào)用~TThread。用delete替代。
~TThread通知線程終止,并在調(diào)用Destroy方法前等待該線程返回。
TThread::DoTerminate
virtual void __fastcall DoTerminate(void);
產(chǎn)生一個OnTerminate事件。
DoTerminate調(diào)用OnTerminate時間句柄,但并不終止該線程。
TThread::Execute
virtual void __fastcall Execute(void) =0;
提供包含線程執(zhí)行時所需代碼的抽象方法。
Execute查看Terminated屬性值以決定該線程是否需要終止。
當CreateSuspended被設(shè)置為False,當調(diào)用Create時,一線程執(zhí)行;在線程創(chuàng)建后先調(diào)用了Resume且CreateSuspended為True,一線程執(zhí)行。
注意:不要在線程的Execute方法中直接調(diào)用
其他對象的屬性和方法。應(yīng)該將對其他對象的使用分成幾個不同的過程,將其作為一個傳遞到Synchronize方法的參數(shù)分別調(diào)用。
TThread::Resume
void __fastcall Resume(void);
重新執(zhí)行一個掛起的線程。
調(diào)用Suspend可以嵌套。因此調(diào)用Resume必須注意次序。
TThread::Suspend
void __fastcall Suspend(void);
掛起一個運行中的線程。
調(diào)用Resume可以繼續(xù)運行。調(diào)用Suspend可以嵌套。因此調(diào)用Resume必須次序。
TThread::Synchronize
typedef void __fastcall(__closure* TThreadMethod)(void);
void __fastcall Synchronize (TThreadMethod&Method);
在主VCL線程中執(zhí)行Method。
Synchronize方法由Method指定的調(diào)用被主VCL線程執(zhí)行。
注意:當在主VCL線程中執(zhí)行Method時,當前的線程被掛起。
TThread::Terminate
void __fastcall Terminate(void);
通過將Terminated屬性設(shè)置為True通知線程終止。
線程的Execute方法以及Execute調(diào)用的任何方法應(yīng)周期性的檢查Terminated,當其為True時終止運行。
TThread::TThread
__fastcall TThread(bool CreateSuspended);
創(chuàng)建一個線程對象的實例。
在應(yīng)用中不要直接使用TThread來創(chuàng)建線程。用new替代,傳遞CreateSuspended參數(shù)argument。若CreateSuspended為False,Execute被立即調(diào)用。若CreateSuspended為True,Execute直到Resume被調(diào)用后才被調(diào)用。
TThread::WaitFor
int __fastcall WaitFor(void);
等待線程終止并返回ReturnValue屬性值。
直到線程終止時WaitFor才返回,因此線程一定是因為結(jié)束了Execute方法或因Terminated屬性為了True而終止。如果該線程使用Synchronize,則不要在主VCL線程中調(diào)用WaitFor,否則或者引起系統(tǒng)死機,或者產(chǎn)生一個EThread異常。
Synchronize在允許該方法生效前等待主VCL線程進入信息回路。若主VCL線程已經(jīng)調(diào)用了WaitFor,它將不會進入信息回路,Synchronize也永遠不會返回。此時,TThread將產(chǎn)生一個EThread意外并使該線程終止;而且如果該意外沒有被Execute方法截獲,該應(yīng)用也將終止。如果調(diào)用WaitFor時,Synchronize已經(jīng)在VCL線程中等待,TThread將不會干預,應(yīng)用程序?qū)⑺罊C。
事件
TThread::OnTerminate
__property TNotifyEvent OnTerminate = {read=FOnTerminate,write=FOnTerminate};
當線程的Execute方法已經(jīng)返回且在該線程被刪除之前發(fā)生。
OnTerminate事件句柄在主VCL線程被調(diào)用。該線程對象也可在該事件中被釋放。