青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

twzheng's cppblog

『站在風口浪尖緊握住鼠標旋轉!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  136 隨筆 :: 78 文章 :: 353 評論 :: 0 Trackbacks
AfxBeginThread函數初探
版權所有 codesky.net 2003-2005
發表時間:2005-1-16    關鍵字:不詳

在進行多線程程序設計的時候,我們經常用到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
{
public:
        static UINT __stdcall myThreadFunc(LPVOID lparam);
}
之所以要定義成類的靜態成員函數,是因為類的靜態成員函數不屬于某個類對象,這樣在調用函數
的時候就不用傳遞一個額外的this指針.

pThreadClass:指向從CWinThread派生的子類對象的RUNTIME_CLASS

pParam:要傳遞給線程函數的參數

nPriority:要啟動的線程的優先級,默認優先級為THREAD_PRIORITY_NORMAL(普通優先級),關于線程
 優先級的詳細說明請參考Platform SDK SetThreadPriority函數說明

nStackSize:新線程的堆棧大小,如果設置為0,則使用默認大小,在應用程序中一般情況下線程的默認堆棧大小
 為1M

dwCreateFlags:線程創建標志,該參數可以指定為下列標志
 CREATE_SUSPENDED:以掛起方式啟動線程,如果你在線程啟動之前想初始化一些CWinThread類中的一些成員變量
 比如:m_bAutoDelete或者你的派生類中的成員變量,當初始化完成之后,你可以使用CWinThread類的ResumeThread
 成員函數來恢復線程的運行
 如果把該標志設置為0,則表示立即啟動線程
lpSecurityAttrs:指向安全描述符的指針,如果使用默認的安全級別只要講該參數設置為NULL就可以了!

上面就是AfxBeginThread函數的簡單說明,我們在使用的時候一般情況下只要指定前兩個參數,其他
參數使用默認值就可以.嗯,的確,使用起來是很簡單,只要這個函數一被調用,就創建了一個線程.
但是大家有沒有想過,AfxBeginThread函數究竟是如何啟動的線程呢?它的內部是如何實現的呢?

下面我們就來看一下AfxBeginThread函數的內部實現

//啟動worker線程
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,
 int nPriority, UINT nStackSize, DWORD dwCreateFlags,
 LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{
#ifndef _MT
         pfnThreadProc;
         pParam;
         nPriority;
         nStackSize;
         dwCreateFlags;
         lpSecurityAttrs;

         return NULL;
#else
         ASSERT(pfnThreadProc != NULL);

         CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam);
         ASSERT_VALID(pThread);

         if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,
                  lpSecurityAttrs))
         {
                  pThread->Delete();
                  return NULL;
         }
         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)
{
#ifndef _MT
        pThreadClass;
        nPriority;
        nStackSize;
        dwCreateFlags;
        lpSecurityAttrs;

        return NULL;
#else
        ASSERT(pThreadClass != NULL);
        ASSERT(pThreadClass->IsDerivedFrom(RUNTIME_CLASS(CWinThread)));

        CWinThread* pThread = (CWinThread*)pThreadClass->CreateObject();
        if (pThread == NULL)
                AfxThrowMemoryException();
        ASSERT_VALID(pThread);

        pThread->m_pThreadParams = NULL;
        if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,
                lpSecurityAttrs))
        {
                pThread->Delete();
                return NULL;
        }
        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老手來說,這篇文章可能并沒有什么可讀之處,但是對于初學者來說,還是有一定的
價值的!
總之,希望這篇文章能給各位一點點的幫助!

posted on 2007-05-05 13:42 譚文政 閱讀(681) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品日韩在线观看| 亚洲第一精品夜夜躁人人爽 | 欧美激情欧美激情在线五月| 欧美成人激情在线| 亚洲欧美成人网| 91久久精品美女| 影音先锋亚洲精品| 亚洲电影毛片| 亚洲国产精品第一区二区| 欧美有码视频| 欧美在线免费观看| 猫咪成人在线观看| 亚洲国产精品传媒在线观看| 亚洲东热激情| 亚洲一区二区三区四区在线观看| 亚洲欧洲综合另类| 亚洲香蕉网站| 久久精品99国产精品日本 | 亚洲一区免费看| 亚洲午夜成aⅴ人片| 亚洲欧美日韩一区二区三区在线观看 | 一区二区亚洲精品| 亚洲精品美女久久7777777| 日韩视频免费在线| 亚洲私人影院| 亚洲黄色在线| 久久久综合视频| 欧美吻胸吃奶大尺度电影| 国产一区免费视频| 亚洲综合999| 亚洲国产婷婷| 欧美一区二区三区在线视频 | 欧美一区亚洲| 欧美系列电影免费观看| 亚洲国产你懂的| 欧美91精品| 久热精品视频在线免费观看| 国产欧美一区二区三区久久| 日韩视频三区| 亚洲第一福利在线观看| 久久综合色一综合色88| 好吊视频一区二区三区四区| 欧美怡红院视频一区二区三区| 亚洲精品少妇30p| 欧美激情综合色| 亚洲男人的天堂在线aⅴ视频| 日韩亚洲欧美成人| 国产精品久久久久久久第一福利| 一区二区三区你懂的| 香蕉免费一区二区三区在线观看| 欧美日韩亚洲视频一区| 亚洲午夜一区二区三区| 亚洲综合视频网| 精品福利免费观看| 亚洲伦理中文字幕| 国产亚洲欧美一级| 亚洲国产va精品久久久不卡综合| 欧美电影在线观看完整版| 99国产精品国产精品久久| 一区二区欧美日韩| 日韩性生活视频| 久久精品亚洲精品| 午夜精品三级视频福利| 免费短视频成人日韩| 久久女同精品一区二区| 国产精品青草综合久久久久99| 国产精品啊啊啊| 久久一区亚洲| 欧美高清视频| 欧美顶级艳妇交换群宴| 国产精品日韩二区| 亚洲欧美在线一区| 午夜在线精品偷拍| 欧美片网站免费| 亚洲第一中文字幕| 99精品国产热久久91蜜凸| 免费观看成人网| 亚洲国产精品日韩| 日韩视频免费在线| 欧美性大战久久久久久久| 一本一本久久| 久久精品伊人| 亚洲国产成人久久综合一区| 久久se精品一区二区| 亚洲电影一级黄| 亚洲欧美日韩国产综合精品二区| 国产一区二区三区在线观看免费| 久久福利一区| 亚洲级视频在线观看免费1级| 亚洲国产精品久久久| 欧美日韩国产美| 欧美一级片久久久久久久| 亚洲国产精品久久久久秋霞影院 | 亚洲欧洲精品一区二区| 一区二区三区四区五区精品| 国产欧美日本在线| 免费毛片一区二区三区久久久| 亚洲欧洲一区| 欧美成年人视频| 国产欧美精品日韩精品| 欧美在线观看视频| 亚洲一区二区三区视频播放| 亚洲精品一区在线| 91久久久精品| 亚洲福利视频二区| 亚洲国产高清高潮精品美女| 久久久久久**毛片大全| 香蕉久久夜色精品| 亚洲视频在线观看免费| 99国产精品久久久久老师| 亚洲精品欧美在线| av成人激情| 一本久久a久久免费精品不卡| 亚洲黄色高清| 一本综合精品| 一区二区高清视频| 午夜精品久久久久久久99水蜜桃 | 亚洲欧美另类在线观看| 999亚洲国产精| 一本色道久久综合亚洲精品高清| 亚洲日韩视频| 在线亚洲自拍| 欧美专区福利在线| 免费在线观看精品| 欧美片第一页| 国内偷自视频区视频综合| 影音先锋中文字幕一区| 亚洲人成绝费网站色www| 一本色道久久综合亚洲精品不| 一区二区三区精品久久久| 亚洲伊人网站| 欧美丰满少妇xxxbbb| 亚洲精品一区二区网址| 欧美一激情一区二区三区| 欧美激情一二区| 国产精品一区二区久久久久| 亚洲欧美日韩精品久久亚洲区| 午夜精品一区二区三区四区| 欧美日本不卡| 国产一区再线| 欧美一区二区三区免费观看| 亚洲精品美女免费| 欧美3dxxxxhd| 亚洲第一在线综合网站| 久久久久久夜| 午夜精品区一区二区三| 国产精品一区二区视频| 亚洲先锋成人| 日韩午夜在线播放| 久久久国产一区二区| 午夜精品福利一区二区三区av| 欧美日韩成人激情| 亚洲一级在线| 亚洲一区二区毛片| 国产精品一区视频网站| 久久er99精品| 久久人人爽人人| 亚洲精品免费观看| 日韩一级精品视频在线观看| 免费久久精品视频| 亚洲女同精品视频| 午夜精品网站| 亚洲国产精品小视频| 亚洲国产日韩欧美在线99| 欧美色图天堂网| 久久久久九九视频| 欧美韩国在线| 小黄鸭精品aⅴ导航网站入口| 久久成人国产| 亚洲欧美成人综合| 久久久久成人网| 亚洲砖区区免费| 久久综合色婷婷| 久久精品1区| 国产精品成人观看视频国产奇米| 亚洲欧洲av一区二区| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲精品孕妇| 浪潮色综合久久天堂| 久久精品国产精品| 国产精品免费看片| 99精品视频免费| 麻豆freexxxx性91精品| 欧美在线视频全部完| 欧美女同在线视频| 亚洲国产三级| 亚洲日本中文字幕| 免费成人毛片| 亚洲国产日韩欧美一区二区三区| 韩日精品视频| 久久免费视频网站| 久久久久久尹人网香蕉| 国内精品久久久| 久久久久久久久综合| 亚洲电影av| 日韩天堂在线视频| 国产精品日韩精品欧美精品| 欧美一区二区视频网站| 久久亚洲综合色一区二区三区| 亚洲国产99|