MFC全域性函式 AfxBeginThread

2021-05-24 12:38:26 字數 3612 閱讀 1332

函式功能描述:建立新的執行緒

函式原型:

cwinthread* afxbeginthread( afx_threadproc pfnthreadproc, lpvoid pparam, int npriority = 

thread_priority_normal, uint nstacksize = 0, 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:工作執行緒的函式指標,不可以為空。並且工作執行緒的函式必須如此宣告:

uint mycontrollingfunction( lpvoid pparam );

pthreadclass: 從cwinthread類繼承來的物件的runtime_class指標。

pparam:    傳遞給工作執行緒函式pfnthreadproc的引數。

npriority:  執行緒的優先順序。如果為0,則與建立它的執行緒優先順序相同。可以通過參考win32 programmer』s reference中的setthreadpriority得到所有可用的優先順序列表和描述。

nstacksize:  以位元組為單位指定新執行緒的堆疊大小。如果為0,則與建立它的執行緒的堆疊大小相同。

dwcreateflags:指定乙個額外的標誌控制線程的產生。它可以包括下面兩個值中的乙個:

create_suspended:以掛起模式開始執行緒,並且指定掛起次數.當呼叫resumethread時,這個執行緒才會被執行。

0:建立之後,馬上執行執行緒。

lpsecurityattrs:指向security_attributes結構的指標,結構中指定了執行緒的安全屬性。如果為null,則與建立它的執行緒的安全屬性相同。如果希望得到更多的有關security_attributes結構的資訊, 請參考win32 programmer』s reference。

return 0;//什麼不做

} 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 cruntimeclass pthreadclass,int npriority thread priority normal,uint nstacksize 0,dword dwcreateflags 0,lpsecurity attribute...

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 這些函式從名稱上可見豹斑 ...