MFC的多線程函數必須聲明為靜態的或者是全局函數(不同的在於全局函數不能訪問類的私有靜態成員,而靜態類函數可以):但這樣的線程函數只能訪問靜態的成員變量,要實現訪問類的其他成員,可以這樣實現:
1)全局函數。如 UINT MyThread(LPVOID p)
2)類的靜態成員函數。如 static UINT MyView::MyThread(LPVOID p)
線程函數是可以帶參數的,比如 static __stdcall workthread(LPVOID lpParam)你可以在創建這個線程的時候,把對象指針傳遞到lpParam,然后使用這個指針就可以在線程函數里調用非靜態成員變量和函數了。線程函數之所以必須是靜態函數,是因為類的靜態函數不屬於該類的任何一個對象,它屬於類的本事,所以在運行時可以直接調用類的靜態函數,從而啟動線程!
注意:一定要是靜態的成員函數,不然會提示error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__cdecl *)(void *)
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則是編譯器對它的封裝。
