MFC全域性函式 AfxBeginThread

2021-05-25 16:19:03 字數 2421 閱讀 5912

**:

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();

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

MFC全域性函式 AfxBeginThread

函式功能描述 建立新的執行緒 函式原型 cwinthread afxbeginthread afx threadproc pfnthreadproc,lpvoid pparam,int npriority thread priority normal,uint nstacksize 0,dword ...

MFC全域性函式 AfxBeginThread

函式原型 cwinthread afxbeginthread afx threadproc pfnthreadproc,lpvoid pparam,int npriority thread priority normal,uint nstacksize 0,dword dwcreateflags 0...

MFC全域性函式開局 AfxGetApp解剖

mfc中有不少的全域性函式,方便在不同物件中獲取不同的內容或建立不同的物件。主要全域性函式有 afxwininit afxbeginthread afxendthread afxformatstring1 afxformatstring2 afxregisterclass 這些函式從名稱上可見豹斑 ...