AfxBeginThread 幹了什麼?

2021-05-27 01:55:02 字數 2288 閱讀 3707

跟一跟afxbeginthread的原始碼就可以很容易的發現,它呼叫了_beginthreadex,注意這傢伙傳遞的可不是你傳進去的函式函式指標,它傳的是_afxthreadentry和乙個_afx_thread_startup的結構,那我們的函式指標和引數呢??哦,原來都被封裝到_afx_thread_startup裡面了,那afxthreadentry這傢伙想幹什麼。。

它呼叫了api createthread,傳遞的是_threadstartex和_ptiddata結構的引數,啊,原來上面的指標和引數又被打包成乙個引數了,那最後呼叫的效果還會和原來的一樣嗎。。

原來在threadstartex中它又開始拆包工作了,最後和tcp/ip協議棧一樣,拆出了我們的函式和引數

_endthreadex (

( (unsigned (__clr_or_std_call *)(void *))(((_ptiddata)ptd)->_initaddr) )

( ((_ptiddata)ptd)->_initarg ) ) ;

這是threadex.c裡面的**。。這不是在拆包嗎~~mfc的框架在模仿tcp/ip結構,這樣做是。。?為了傳遞足夠的資訊!!保證執行緒的安全~~~

uint apientry _afxthreadentry(void* pparam)

end_catch_all

// pstartup is invlaid after the following

// setevent (but hevent2 is valid)

handle hevent2 = pstartup->hevent2;

// allow the creating thread to return from cwinthread::createthread

verify(::setevent(pstartup->hevent));

// wait for thread to be resumed

verify(::waitforsingleobject(hevent2, infinite) == wait_object_0);

::closehandle(hevent2);

// first -- check for ****** worker thread

dword nresult = 0;

if (pthread->m_pfnthreadproc != null)

// else -- check for thread with message loop

else if (!pthread->initinstance())

else

// cleanup and shutdown the thread

threadwnd.detach();

afxendthread(nresult);

return 0;   // not reached

}void afxapi afxinitthread()//設定個訊息鉤子,hook之後它還想幹什麼?這個我就不知道了。。

}上面的**很清楚了,就一封包拆包過程,看了此文你就知道李久進講的mfc執行緒是怎麼來的了。。都是慢悠悠跟出來的~~

_afxmsgfilterhook這傢伙長這個樣

lresult callback _afxmsgfilterhook(int code, wparam wparam, lparam lparam)

assert(pthread != null);

return (lresult)pthread->processmessagefilter(code, (lpmsg)lparam);

}完了,一天都在跟mfc原始碼,再跟下回學校了,剛聽說明天不加班,哈哈。。

bool cwinthread::processmessagefilter(int code, lpmsg lpmsg)}}

// fall through...

case msgf_dialogbox:    // handles message boxes as well.

pmainwnd = afxgetmainwnd();

if (code == msgf_dialogbox && m_pactivewnd != null &&

lpmsg->message >= wm_keyfirst && lpmsg->message <= wm_keylast)

pthreadstate->m_binmsgfilter = false;    // ok again

}break;

}return false;   // default to not handled

}頭暈,回校~~

AfxBeginThread函式初探

在進行多執行緒程式設計的時候,我們經常用到afxbeginthread函式來啟動一條執行緒 該函式使用起來非常的簡單方便,其定義如下 cwinthread afxbeginthread afx threadproc pfnthreadproc,執行緒函式位址 lpvoid pparam,執行緒引數 ...

AfxBeginThread建立執行緒

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

函式AfxBeginThread裡面引數意義

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