C++ Builder 參考手冊(cè) ? System::Classes ? TThread ? Queue
頭文件:#include <System.Classes.hpp>
命名空間:System::Classes
類:TThread
訪問(wèn)權(quán)限:public: / protected:
函數(shù)原型:
public:
static void __fastcall Queue(TThread* const AThread, TThreadMethod AMethod);
static void __fastcall Queue(TThread* const AThread, _di_TThreadProcedure AThreadProc);
protected:
void __fastcall Queue(TThreadMethod AMethod);
void __fastcall Queue(_di_TThreadProcedure AThreadProc);
Queue 是 TThread 的成員函數(shù),把一個(gè)函數(shù)加入異步執(zhí)行隊(duì)列缀磕。
參數(shù):
AThread:要進(jìn)行異步執(zhí)行的函數(shù)所在的線程對(duì)象缘圈,如果不需要在主線程調(diào)用那里訪問(wèn)線程對(duì)象,這個(gè)參數(shù)可以為 NULL袜蚕;
AMethod:需要在主線程異步執(zhí)行的方法糟把;
AThreadProc:需要在主線程異步執(zhí)行的匿名函數(shù)。
返回值:
無(wú)廷没。
- Queue 把一個(gè)函數(shù)加入異步執(zhí)行隊(duì)列糊饱,這個(gè)函數(shù)將在主線程里面執(zhí)行垂寥,但是不要在主線程里面調(diào)用 Queue颠黎。
- ForceQueue 把一個(gè)函數(shù)加入異步執(zhí)行隊(duì)列,可以在主線程里面調(diào)用這個(gè)方法滞项;
- Queue 和 ForceQueue 不等待放入隊(duì)列的函數(shù)的執(zhí)行狭归,函數(shù)放入執(zhí)行隊(duì)列之后立即返回,繼續(xù)執(zhí)行線程的其他代碼文判,如果要讓一個(gè)函數(shù)在主線程里面執(zhí)行过椎,并且等待這個(gè)函數(shù)執(zhí)行完成,需要用 Synchronize 方法戏仓;
- AThreadProc 參數(shù)在 C++ 里面需要繼承 TCppInterfacedObject<TThreadProcedure> 并且重載 Invoke 方法疚宇,把 new 出來(lái)的對(duì)象傳遞給 AThreadProc 參數(shù),這個(gè) Invoke 方法就是異步執(zhí)行的函數(shù)赏殃,這個(gè)對(duì)象在異步執(zhí)行函數(shù)結(jié)束之后自動(dòng)銷毀敷待;
- 線程結(jié)束時(shí)會(huì)取消異步執(zhí)行隊(duì)列的執(zhí)行节值,如果還沒(méi)等隊(duì)列里面的函數(shù)執(zhí)行時(shí)讥耗,線程已經(jīng)結(jié)束了氏堤,就不會(huì)執(zhí)行加入隊(duì)列里面的函數(shù),本文后面的例子也會(huì)說(shuō)明這一點(diǎn)泄隔。
例1:使用 TThreadMethod AMethod 參數(shù)的 Queue 方法,即成員函數(shù)指針參數(shù):
class TTestThread : public System::Classes::TThread
{
public:
TTestThread()
: System::Classes::TThread(true)
{
FreeOnTerminate = true;
}
private:
void __fastcall Function1(void)
{
UnicodeString s;
DWORD dwThreadID = ::GetCurrentThreadId();
ShowMessage(s.sprintf(L"Queued Function1, ThreadID=%ld", dwThreadID));
}
void __fastcall Function2(void)
{
UnicodeString s;
DWORD dwThreadID = ::GetCurrentThreadId();
ShowMessage(s.sprintf(L"Synchronized Function2, ThreadID=%ld", dwThreadID));
}
protected:
void __fastcall Execute(void)
{
Queue(Function1);
Synchronize(Function2);
}
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString s;
DWORD dwThreadID = ::GetCurrentThreadId();
ShowMessage(s.sprintf(L"Main thread: ThreadID=%ld", dwThreadID));
(new TTestThread)->Start();
}
運(yùn)行結(jié)果:
- 通過(guò)運(yùn)行結(jié)果可以看到俯渤,在 Button1 里面獲取的主線程ID馍忽、Queue 調(diào)用的 Function1 里面,Synchronize 調(diào)用的 Function2 里面的線程ID都是相同的妨猩,說(shuō)明 Function1 和 Function2 都運(yùn)行在主線程里面潜叛;
- 如果去掉 TTestThread::Execute 里面的 Synchronize(Function2); 會(huì)發(fā)現(xiàn) Function1 也沒(méi)有被執(zhí)行,原因是還沒(méi)等 Function1 執(zhí)行壶硅,線程已經(jīng)結(jié)束了钠导,線程結(jié)束時(shí)會(huì)取消異步隊(duì)列的執(zhí)行。如果把 Synchronize 那個(gè)位置換成一個(gè)延時(shí)森瘪,F(xiàn)unction1 也會(huì)執(zhí)行牡属,只要 Function1 執(zhí)行之前線程沒(méi)有結(jié)束就可以。
例2:使用 _di_TThreadProcedure AThreadProc 參數(shù)的 Queue 方法
class TQueuedFunc : public TCppInterfacedObject<TThreadProcedure>
{
public:
void __fastcall Invoke(void)
{
UnicodeString s;
DWORD dwThreadID = ::GetCurrentThreadId();
ShowMessage(s.sprintf(L"TQueuedFunc::Invoke: ThreadID=%ld", dwThreadID));
}
};
class TTestThread : public System::Classes::TThread
{
public:
TTestThread()
: System::Classes::TThread(true)
{
FreeOnTerminate = true;
}
protected:
void __fastcall Execute(void)
{
Queue(new TQueuedFunc);
for(int i=0; i<100; i++)
{
Sleep(1);
}
}
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString s;
DWORD dwThreadID = ::GetCurrentThreadId();
ShowMessage(s.sprintf(L"Main thread: ThreadID=%ld", dwThreadID));
(new TTestThread)->Start();
}
運(yùn)行結(jié)果:
- 通過(guò)運(yùn)行結(jié)果可以看到扼睬,在 Button1 里面獲取的主線程ID 和 Queue 調(diào)用的 TQueuedFunc::Invoke 里面的線程ID都是相同的逮栅,說(shuō)明 TQueuedFunc::Invoke 運(yùn)行在主線程里面;
- 如果去掉 TTestThread::Execute 里面的循環(huán)延時(shí)窗宇,TQueuedFunc::Invoke 不會(huì)執(zhí)行措伐,new 出來(lái)的 TQueuedFunc 對(duì)象直接被銷毀了,因?yàn)檫€沒(méi)等執(zhí)行 TQueuedFunc::Invoke 線程已經(jīng)結(jié)束了军俊,線程結(jié)束時(shí)會(huì)取消這個(gè)線程異步執(zhí)行隊(duì)列的執(zhí)行侥加。
相關(guān):
- System::TCppInterfacedObject
- System::Classes::TThreadProcedure
- System::Classes::_di_TThreadProcedure
- System::Classes::TThread::ForceQueue
- System::Classes::TThread::Synchronize
- System::Classes::TThread::RemoveQueuedEvents
- System::Classes::TThread::CreateAnonymousThread
- System::Classes::TThread
- System::Classes::TComponent::BeginInvoke
- System::Classes::TComponent::EndInvoke
- System::Classes::TComponent::EndFunctionInvoke
- System::TObject
- VCL 類繼承關(guān)系
C++ Builder 參考手冊(cè) ? System::Classes ? TThread ? Queue