转:MFC中创建多线程
MFC中創(chuàng)建多線程
MFC的多線程函數(shù)必須聲明為靜態(tài)的或者是全局函數(shù)(不同的在于全局函數(shù)不能訪問類的私有靜態(tài)成員,而靜態(tài)類函數(shù)可以):但這樣的線程函數(shù)只能訪問靜態(tài)的成員變量,要實(shí)現(xiàn)訪問類的其他成員,可以這樣實(shí)現(xiàn):
1)全局函數(shù)。如 ? UINT ? MyThread(LPVOID ? p)?
2)類的靜態(tài)成員函數(shù)。如 ? static ? UINT ? MyView::MyThread(LPVOID ? p)?
線程函數(shù)是可以帶參數(shù)的,比如??static?__stdcall??workthread(LPVOID?lpParam)你可以在創(chuàng)建這個(gè)線程的時(shí)候,把對(duì)象指針傳遞到lpParam,然后使用這個(gè)指針就可以在線程函數(shù)里調(diào)用非靜態(tài)成員變量和函數(shù)了。線程函數(shù)之所以必須是靜態(tài)函數(shù),是因?yàn)轭惖撵o態(tài)函數(shù)不屬于該類的任何一個(gè)對(duì)象,它屬于類的本事,所以在運(yùn)行時(shí)可以直接調(diào)用類的靜態(tài)函數(shù),從而啟動(dòng)線程!
注意:一定要是靜態(tài)的成員函數(shù),不然會(huì)提示error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__cdecl *)(void *)
AfxBeginThread和CreateThread具體區(qū)別?
1.?具體說來,CreateThread這個(gè) 函數(shù)是windows提供給用戶的 API函數(shù),是SDK的標(biāo)準(zhǔn)形式,在使用的過程中要考慮到進(jìn)程的同步與互斥的關(guān)系,進(jìn)程間的同步互斥等一系列會(huì)導(dǎo)致操作系統(tǒng)死鎖的因素,用起來比較繁瑣一些,初學(xué)的人在用到的時(shí)候可能會(huì)產(chǎn)生不可預(yù)料的錯(cuò)誤,建議多使用AfxBeginThread,是編譯器對(duì)原來的CreateThread函數(shù)的封裝,用與MFC編程(當(dāng)然,只要修改了項(xiàng)目屬性,console和win32項(xiàng)目都能調(diào)用)而_beginthread是C的運(yùn)行庫函數(shù)。
在使用AfxBeginThread時(shí),線程函數(shù)的定義為:UINT?? _yourThreadFun(LPVOID?? pParam)參數(shù)必須如此在使用CreateThread時(shí),線程的函數(shù)定義為: DWORD WINAPI _yourThreadFun(LPVOID pParameter)
2.CreateThread:是Windows的API函數(shù),直截了當(dāng)?shù)膭?chuàng)建了線程。 它沒有考慮:
1)C Runtime中需要對(duì)多線程進(jìn)行紀(jì)錄和初始化,以保證C函數(shù)庫工作正常(典型的例子是strtok函數(shù))。
2)MFC也需要知道新線程的創(chuàng)建,也需要做一些初始化工作(當(dāng)然,如果沒用MFC就沒事了)。_beginthreadex:MS對(duì)C Runtime庫的擴(kuò)展函數(shù),首先針對(duì)C Runtime庫做了一些初始化的工作,以保證C Runtime庫工作正常。然后,調(diào)用CreateThread真正創(chuàng)建線程。AfxBeginThread:MFC中線程創(chuàng)建的函數(shù),首先創(chuàng)建了相應(yīng)的CWinThread對(duì)象,然后調(diào)用CWinThread::CreateThread, 在CWinThread::CreateThread中,完成了對(duì)線程對(duì)象的初始化工作,然后,調(diào)用_beginthreadex創(chuàng)建線程。
如 果用MFC編程,不要用CreateThread,如果只是使用Runtime Library,用_BegingThread,總之,不要輕易使用CreateThread。這是因?yàn)樵贛FC和RTL中的函數(shù)有可能會(huì)用到些它們所封 裝的公用變量,也就是說AfxBeginThread和_BeginThread都有自己的啟動(dòng)代碼是CreateThread所沒有的。在用 CreateThread所創(chuàng)建的線程中使用MFC的類和RTL函數(shù)就有可能出現(xiàn)問題。如果你是用匯編編寫win32程序并且在線程函數(shù)中也不調(diào)用MFC 和RTL的函數(shù),那用CreateThread就沒問題,或者你雖然是用C寫線程函數(shù),但你很小心沒調(diào)用RTL函數(shù)也不會(huì)有問題。
CreateThread是由操作系統(tǒng)提供的接口,而AfxBeginThread和_BeginThread則是編譯器對(duì)它的封裝。
轉(zhuǎn)載于:https://www.cnblogs.com/yfz0/p/5832658.html
總結(jié)
以上是生活随笔為你收集整理的转:MFC中创建多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Django之Cookie
- 下一篇: 子元素的margin-top影响父元素原
