1)全局函數。如 UINT MyThread(LPVOID p)
2)類的靜態成員函數。如 static UINT MyView::MyThread(LPVOID p)
假設你有一個類
class A
{
public:
A();
UNIT ThreadProc(); //用它來作爲你的線程
protected:
void beginthread();
}
UNIT _ThreadProc(LPVOID lpParam) //可以聲明爲static類型,作爲類的成員函數
{
A *pA = (A *)lpParam;
return pA-> ThreadProc();
}
void A::beginthread()
{
AfxBeginThread(_ThreadProc, (LPVOID)this);
}
所謂靜態的,就是屬於類的,而不是屬於對象的
從內存的角度來說:
一個類,如果不聲明對象,
那麼其一般成員函數就不佔用內存
但是靜態的卻仍然佔用內存!
AfxBeginThread和CreateThread具體區別
1. 具體說來,CreateThread這個 函數是windows提供給用戶的 API函數,是SDK的標準形式,在使用的過程
中要考慮到進程的同步與互斥的關係,進程間的同步互斥等一系列會導致操作系統死鎖的因素,用起來比較繁
瑣一些,初學的人在用到的時候可能會產生不可預料的錯誤,建議多使用AfxBeginThread,是編譯器對原來的
CreateThread函數的封裝,用與MFC編程(當然,只要修改了項目屬性,console和win32項目都能調用)而_
beginthread是C的運行庫函數。
在使用AfxBeginThread時,線程函數的定義爲:UINT _yourThreadFun(LPVOID pParam)參數必須如此
在使用CreateThread時,線程的函數定義爲: DWORD WINAPI _yourThreadFun(LPVOID pParameter)
2.CreateThread:是Windows的API函數,直截了當的創建了線程。 它沒有考慮:
1)C Runtime中需要對多線程進行紀錄和初始化,以保證C函數庫工作正常(典型的例子是strtok函數)。
2)MFC也需要知道新線程的創建,也需要做一些初始化工作(當然,如果沒用MFC就沒事了)。
_beginthreadex:MS對C Runtime庫的擴展函數,首先針對C Runtime庫做了一些初始化的工作,以保證
C Runtime庫工作正常。然後,調用CreateThread真正創建線程。
AfxBeginThread:MFC中線程創建的函數,首先創建了相應的CWinThread對象,然後調用
CWinThread::CreateThread, 在CWinThread::CreateThread中,完成了對線程對象的初始化工作,
然後,調用_beginthreadex創建線程。
如 果用MFC編程,不要用CreateThread,如果只是使用Runtime Library,用_BegingThread,總之,不要輕易使用CreateThread。這是因爲在MFC和RTL中的函數有可能會用到些它們所封 裝的公用變量,也就是說AfxBeginThread和_BeginThread都有自己的啓動代碼是CreateThread所沒有的。在用 CreateThread所創建的線程中使用MFC的類和RTL函數就有可能出現問題。如果你是用匯編編寫win32程序並且在線程函數中也不調用MFC 和RTL的函數,那用CreateThread就沒問題,或者你雖然是用C寫線程函數,但你很小心沒調用RTL函數也不會有問題。
CreateThread是由操作系統提供的接口,而AfxBeginThread和_BeginThread則是編譯器對它的封裝。