C++ Builder 參考手冊 ? TThread ? CreateAnonymousThread
頭文件:#include <System.Classes.hpp>
命名空間:System::Classes
類:TThread
訪問權(quán)限:public:
函數(shù)原型:
static TThread * __fastcall CreateAnonymousThread(
const System::Sysutils::_di_TProc ThreadProc);
CreateAnonymousThread 是 System::Classes::TThread 的成員函數(shù),創(chuàng)建一個(gè)匿名的線程稳懒。
參數(shù):
ThreadProc:匿名函數(shù) (lambda 表達(dá)式) 或 System::Sysutils::_di_TProc 類型的對象辩蛋;
返回值:
線程對象指針收壕。
- 參數(shù) ThreadProc 為 lambda 表達(dá)式绊困,也支持 System::Sysutils::_di_TProc 類型的對象 (TProc 類型的函數(shù)) 【注】屯阀;
- CreateAnonymousThread 返回的線程對象為線程掛起狀態(tài)救欧,這個(gè)線程對象只能調(diào)用 Start 方法開始執(zhí)行線程值戳,線程結(jié)束之后,這個(gè)線程對象自動(dòng)銷毀愈腾;
【注】如果使用老版本的編譯器憋活,不支持 lambda 表達(dá)式,可以使用 TProc 類型的函數(shù) (當(dāng)然新版本編譯器也可以虱黄,如果不嫌麻煩):即繼承 TCppInterfacedObject<TProc> 并且重載 Invoke 方法悦即,Invoke 的參數(shù)與返回值要和 TProc 相同,這個(gè) Invoke 即線程函數(shù),這個(gè)類的對象指針 new 出來之后辜梳,傳遞給 ThreadProc 參數(shù)粱甫,線程結(jié)束之后,這個(gè)對象會自動(dòng)銷毀冗美,后面的例2演示了這個(gè) TProc 參數(shù)的用法魔种。
例1:點(diǎn)擊 Button1 按鈕,執(zhí)行一段在線程里面運(yùn)行的代碼粉洼,使用 lambda 表達(dá)式,并且在線程里面同步執(zhí)行一個(gè) lambda 表達(dá)式
- 由于線程里面不能處理顯示叶摄,所以用 TThread::Synchronize 顯示線程執(zhí)行的進(jìn)度属韧;
- 由于匿名線程不在線程類里面,所以用 TThread::CurrentThread 獲取當(dāng)前的線程對象蛤吓。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TThread::CreateAnonymousThread([this](){
for(int i=0; i<10; i++)
{
TThread::Synchronize(TThread::CurrentThread, [this](){
Label1->Caption = StrToIntDef(Label1->Caption, 0) + 1;
});
Sleep(200);
}
})->Start();
}
例2:點(diǎn)擊 Button1 按鈕宵喂,執(zhí)行一段在線程里面運(yùn)行的代碼,使用 lambda 表達(dá)式会傲,并且在線程里面同步執(zhí)行一個(gè)窗體的成員函數(shù)
- 由于線程里面不能處理顯示锅棕,所以用 TThread::Synchronize 顯示線程執(zhí)行的進(jìn)度;
- 由于匿名線程不在線程類里面淌山,所以用 TThread::CurrentThread 獲取當(dāng)前的線程對象裸燎。
void __fastcall TForm1::ShowProgress(void)
{
Label1->Caption = StrToIntDef(Label1->Caption, 0) + 1;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TThread::CreateAnonymousThread([this](){
for(int i=0; i<10; i++)
{
TThread::Synchronize(TThread::CurrentThread, ShowProgress);
Sleep(200);
}
})->Start();
}
例3:點(diǎn)擊 Button1 按鈕,創(chuàng)建線程 TMyThreadProc泼疑,不使用 lambda 表達(dá)式德绿。
- 重載 Invoke 方法是必須的,這是線程函數(shù)退渗;
- ShowProgress 方法是用來顯示 iProgress 到 Form1->Label1移稳;
- 由于線程里面不能處理顯示,所以用 TThread::Synchronize 顯示線程執(zhí)行的進(jìn)度会油;
- 由于匿名線程不在線程類里面个粱,所以用 TThread::CurrentThread 獲取當(dāng)前的線程對象。
class TMyThreadProc : public TCppInterfacedObject<TProc>
{
private:
int iProgress;
void __fastcall ShowProgress(void)
{
Form1->Label1->Caption = iProgress;
}
public:
void __fastcall Invoke(void)
{
for(iProgress=1; iProgress<=10; iProgress++)
{
TThread::Synchronize(TThread::CurrentThread, ShowProgress);
Sleep(200);
}
}
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TThread::CreateAnonymousThread(new TMyThreadProc)->Start();
}
運(yùn)行結(jié)果:
點(diǎn)擊 Button1 按鈕翻翩,Label1 顯示的文字顯示從 1 變到 10都许。
參考:
- System::TCppInterfacedObject
- System::Sysutils::_di_TProc
- System::Classes::TThread::Current
- System::Classes::TThread::CurrentThread
- System::Classes::TThread::Synchronize
- System::Classes::TThread
- System::TObject
- VCL 類繼承關(guān)系
C++ Builder 參考手冊 ? TThread ? CreateAnonymousThread