AfxBeginThread函式初探

2021-03-31 11:23:39 字數 2872 閱讀 2252

在進行多執行緒程式設計的時候,我們經常用到afxbeginthread函式來啟動一條執行緒

該函式使用起來非常的簡單方便,其定義如下

cwinthread* afxbeginthread(

afx_threadproc pfnthreadproc,//執行緒函式位址

lpvoid pparam,//執行緒引數

int npriority = thread_priority_normal,//執行緒優先順序

uint nstacksize = 0,//執行緒堆疊大小,預設為1m

dword dwcreateflags = 0,//

lpsecurity_attributes lpsecurityattrs = null

);cwinthread* afxbeginthread(

cruntimeclass* pthreadclass,

int npriority = thread_priority_normal,

uint nstacksize = 0,

dword dwcreateflags = 0,

lpsecurity_attributes lpsecurityattrs = null

);引數說明:

pfnthreadproc:執行緒函式的位址,該引數不能設定為null,執行緒函式必須定義成全域性函式或者類的靜態成員函式

例如:uint mythreadfunc(lpvoid lparam)

或者class a

之所以要定義成類的靜態成員函式,是因為類的靜態成員函式不屬於某個類物件,這樣在呼叫函式

的時候就不用傳遞乙個額外的this指標.

pthreadclass:指向從cwinthread派生的子類物件的runtime_class

pparam:要傳遞給執行緒函式的引數

npriority:要啟動的執行緒的優先順序,預設優先順序為thread_priority_normal(普通優先順序),關於執行緒

優先順序的詳細說明請參考platform sdk setthreadpriority函式說明

nstacksize:新執行緒的堆疊大小,如果設定為0,則使用預設大小,在應用程式中一般情況下執行緒的預設堆疊大小

為1m上面就是afxbeginthread函式的簡單說明,我們在使用的時候一般情況下只要指定前兩個引數,其他

引數使用預設值就可以.嗯,的確,使用起來是很簡單,只要這個函式一被呼叫,就建立了乙個執行緒.

但是大家有沒有想過,afxbeginthread函式究竟是如何啟動的執行緒呢?它的內部是如何實現的呢?

下面我們就來看一下afxbeginthread函式的內部實現

//啟動worker執行緒

cwinthread* afxapi afxbeginthread(afx_threadproc pfnthreadproc, lpvoid pparam,

int npriority, uint nstacksize, dword dwcreateflags,

lpsecurity_attributes lpsecurityattrs)

verify(pthread->setthreadpriority(npriority));

if (!(dwcreateflags & create_suspended))

verify(pthread->resumethread() != (dword)-1);

return pthread;

#endif //!_mt)

}//啟動ui執行緒

cwinthread* afxapi afxbeginthread(cruntimeclass* pthreadclass,

int npriority, uint nstacksize, dword dwcreateflags,

lpsecurity_attributes lpsecurityattrs)

verify(pthread->setthreadpriority(npriority));

if (!(dwcreateflags & create_suspended))

verify(pthread->resumethread() != (dword)-1);

return pthread;

#endif //!_mt

}從上面的**中可以看出afxbeginthread所做的事情主要有以下幾點:

1.在heap中配置乙個新的cwinthread物件(worker執行緒)

**如:cwinthread* pthread = debug_new cwinthread(pfnthreadproc, pparam);

呼叫cruntimeclass結構中的createobject函式建立cwinthread物件

cwinthread* pthread = (cwinthread*)pthreadclass->createobject();

cruntimeclass以及mfc相關類的內部實現,詳情請參考

《深入淺出mfc》侯捷著

2.呼叫cwinthread::createthread()並設定屬性,使執行緒以掛起狀態產生

pthread->createthread(dwcreateflags|create_suspended, nstacksize,lpsecurityattrs);

3.設定執行緒的優先權

pthread->setthreadpriority(npriority);

4.呼叫cwinthread::resumethread

pthread->resumethread();

通過上面的說明,我想大家對該函式到底在內部都做了什麼,應該有乙個初步的了解了!

對於vc老手來說,這篇文章可能並沒有什麼可讀之處,但是對於初學者來說,還是有一定的

價值的!

總之,希望這篇文章能給各位一點點的幫助!

AfxBeginThread 幹了什麼?

跟一跟afxbeginthread的原始碼就可以很容易的發現,它呼叫了 beginthreadex,注意這傢伙傳遞的可不是你傳進去的函式函式指標,它傳的是 afxthreadentry和乙個 afx thread startup的結構,那我們的函式指標和引數呢?哦,原來都被封裝到 afx threa...

AfxBeginThread建立執行緒

使用者介面執行緒和工作者執行緒都是由afxbeginthread建立的。mfc提供了兩個過載版的afxbeginthread,乙個用於使用者介面執行緒,另乙個用於工作者執行緒,分別有如下的原型 使用者介面執行緒的afxbeginthread的原型如下 cwinthread afxapi afxbeg...

函式AfxBeginThread裡面引數意義

cwinthread afxapi afxbeginthread afx threadproc pfnthreadproc,建立的新執行緒名字 也就是乙個執行緒的標示 lpvoid pparam,傳遞進上面執行緒的內容 比如乙個結構體 以下常使用系統預設的引數 int npriority threa...