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

twzheng's cppblog

『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

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

在進行多線程程序設(shè)計的時候,我們經(jīng)常用到AfxBeginThread函數(shù)來啟動一條線程
該函數(shù)使用起來非常的簡單方便,其定義如下

CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,//線程函數(shù)地址
   LPVOID pParam,//線程參數(shù)
   int nPriority = THREAD_PRIORITY_NORMAL,//線程優(yōu)先級
   UINT nStackSize = 0,//線程堆棧大小,默認(rèn)為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
);

參數(shù)說明:
pfnThreadProc:線程函數(shù)的地址,該參數(shù)不能設(shè)置為NULL,線程函數(shù)必須定義成全局函數(shù)或者類的靜態(tài)成員函數(shù)
例如:
UINT myThreadFunc(LPVOID lparam)
或者
class A
{
public:
        static UINT __stdcall myThreadFunc(LPVOID lparam);
}
之所以要定義成類的靜態(tài)成員函數(shù),是因為類的靜態(tài)成員函數(shù)不屬于某個類對象,這樣在調(diào)用函數(shù)
的時候就不用傳遞一個額外的this指針.

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

pParam:要傳遞給線程函數(shù)的參數(shù)

nPriority:要啟動的線程的優(yōu)先級,默認(rèn)優(yōu)先級為THREAD_PRIORITY_NORMAL(普通優(yōu)先級),關(guān)于線程
 優(yōu)先級的詳細(xì)說明請參考Platform SDK SetThreadPriority函數(shù)說明

nStackSize:新線程的堆棧大小,如果設(shè)置為0,則使用默認(rèn)大小,在應(yīng)用程序中一般情況下線程的默認(rèn)堆棧大小
 為1M

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

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

下面我們就來看一下AfxBeginThread函數(shù)的內(nèi)部實現(xiàn)

//啟動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);
調(diào)用CRuntimeClass結(jié)構(gòu)中的CreateObject函數(shù)創(chuàng)建CWinThread對象
CWinThread* pThread = (CWinThread*)pThreadClass->CreateObject();
CRuntimeClass以及MFC相關(guān)類的內(nèi)部實現(xiàn),詳情請參考
《深入淺出MFC》侯捷著

2.調(diào)用CWinThread::CreateThread()并設(shè)定屬性,使線程以掛起狀態(tài)產(chǎn)生
pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,lpSecurityAttrs);

3.設(shè)定線程的優(yōu)先權(quán)
pThread->SetThreadPriority(nPriority);

4.調(diào)用CWinThread::ResumeThread
pThread->ResumeThread();

通過上面的說明,我想大家對該函數(shù)到底在內(nèi)部都做了什么,應(yīng)該有一個初步的了解了!
對于VC老手來說,這篇文章可能并沒有什么可讀之處,但是對于初學(xué)者來說,還是有一定的
價值的!
總之,希望這篇文章能給各位一點點的幫助!

posted on 2007-05-05 13:42 譚文政 閱讀(681) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人成网站在线播| 久久精品国产一区二区三| 久久日韩精品| 久久久久久久久一区二区| 欧美一区二区三区四区在线| 欧美一区免费| 久久一区二区三区超碰国产精品| 久久久国产精品一区二区三区| 久久精品国产亚洲5555| 久久精品欧美日韩精品| 久久蜜臀精品av| 欧美精彩视频一区二区三区| 欧美日韩在线视频一区| 国产精品午夜在线| 亚洲第一色在线| 一本色道88久久加勒比精品| 欧美亚洲色图校园春色| 麻豆精品一区二区综合av| 亚洲国产精品久久91精品| 99精品视频网| 久久久.com| 欧美午夜视频| 激情亚洲一区二区三区四区| 99精品免费网| 久久午夜激情| 一本色道久久综合亚洲91| 午夜久久福利| 欧美日韩成人综合在线一区二区| 国产精品一区二区三区观看| 在线日韩欧美| 欧美一区二区三区另类| 亚洲高清在线| 欧美在线看片a免费观看| 欧美精品自拍偷拍动漫精品| 国产区精品视频| 日韩视频精品| 久热re这里精品视频在线6| 一本色道久久精品| 欧美69视频| 极品尤物一区二区三区| 午夜国产一区| 亚洲精选视频在线| 老司机午夜免费精品视频| 国产精品午夜春色av| 一本大道av伊人久久综合| 久热re这里精品视频在线6| 亚洲综合国产| 亚洲人被黑人高潮完整版| 亚洲欧美成人一区二区三区| 免费在线欧美视频| 激情综合视频| 久久久国产精品一区二区三区| 一本色道久久| 欧美三级资源在线| 一区二区国产在线观看| 欧美激情亚洲| 欧美a一区二区| 亚洲国产日韩在线一区模特| 美女亚洲精品| 狼狼综合久久久久综合网 | 久久久久久久一区二区| 国产精品久久久久久久9999| 亚洲午夜视频在线| 在线午夜精品自拍| 欧美日韩综合视频网址| 亚洲一区黄色| 亚洲图色在线| 国产伦精品一区二区三区免费迷 | 欧美多人爱爱视频网站| 理论片一区二区在线| 亚洲国产合集| 久久野战av| 久久综合给合久久狠狠色| 在线观看欧美激情| 最新日韩在线| 欧美午夜不卡影院在线观看完整版免费 | 亚洲一区二区不卡免费| 一区二区不卡在线视频 午夜欧美不卡在 | 国产视频亚洲精品| 久久青草久久| 欧美jizz19性欧美| 夜夜嗨av一区二区三区四季av| 亚洲每日在线| 国产精品拍天天在线| 久久久久久久综合| 欧美成年人在线观看| 亚洲午夜激情| 性感少妇一区| 亚洲人成在线观看网站高清| 91久久精品视频| 国产精品久久久久久久久久免费看 | 欧美不卡激情三级在线观看| 99re6这里只有精品| 亚洲尤物视频在线| 在线精品视频免费观看| 亚洲精品一区二区三| 欧美中文在线观看| 亚洲精品资源| 亚洲性xxxx| 一区在线影院| 亚洲最黄网站| 在线观看亚洲精品| 一片黄亚洲嫩模| 亚洲福利视频二区| 亚洲午夜国产成人av电影男同| 狠狠噜噜久久| 一区二区三区国产| 最新中文字幕一区二区三区| 午夜精品三级视频福利| 一区二区三区黄色| 久久综合狠狠| 欧美影视一区| 欧美精品在线观看播放| 久久亚裔精品欧美| 国产精品视频网站| 亚洲国产精品国自产拍av秋霞 | 欧美一区二区视频在线观看2020 | 亚洲欧美一区二区在线观看| 亚洲黄色毛片| 久久精品国产清自在天天线| 午夜在线一区| 欧美特黄一区| 亚洲精品久久| 亚洲欧洲综合另类| 久久人人精品| 久久综合九色欧美综合狠狠| 国产精品入口日韩视频大尺度| aa级大片欧美三级| 一本色道久久88综合日韩精品| 久久婷婷久久| 蜜桃视频一区| 激情文学一区| 久久视频免费观看| 久久综合九色综合欧美就去吻 | 亚洲欧美日本另类| 欧美人与性禽动交情品| 亚洲欧洲日产国码二区| 99视频在线观看一区三区| 欧美成人免费视频| 亚洲国产高清一区| 日韩午夜av电影| 免费永久网站黄欧美| 亚洲丰满在线| 日韩视频在线一区二区三区| 欧美精品播放| 日韩视频免费观看高清在线视频 | 欧美电影电视剧在线观看| 亚洲观看高清完整版在线观看| 欧美成人免费va影院高清| 亚洲欧洲精品成人久久奇米网 | 欧美精品网站| 一区二区不卡在线视频 午夜欧美不卡在 | 噜噜噜躁狠狠躁狠狠精品视频| 免费在线国产精品| 亚洲国产精品电影| 欧美精品二区| 亚洲视频综合| 久久精品一区二区国产| 亚洲大胆人体在线| 欧美日本中文| 亚洲免费人成在线视频观看| 久久女同精品一区二区| 亚洲精品国产精品乱码不99按摩 | 亚洲精品美女在线观看| 亚洲私人影吧| 国产午夜精品麻豆| 久久这里只有精品视频首页| 亚洲黄色在线视频| 欧美一区不卡| 在线免费不卡视频| 欧美日韩免费高清| 欧美一站二站| 亚洲精美视频| 久久精品国产欧美亚洲人人爽| 一区在线免费观看| 欧美视频二区| 麻豆九一精品爱看视频在线观看免费| 亚洲精品欧美日韩专区| 欧美中文字幕精品| 亚洲精品中文字幕在线| 国产亚洲成年网址在线观看| 欧美好骚综合网| 欧美在线观看视频一区二区| 亚洲人精品午夜| 久久久午夜电影| 亚洲一区二区三区成人在线视频精品| 国产日韩欧美日韩| 欧美日韩国产精品一卡| 久久久久久穴| 亚洲影院免费| 亚洲精品视频免费观看| 鲁鲁狠狠狠7777一区二区| 亚洲欧美久久久| 亚洲精品欧美极品| 在线播放日韩欧美| 国产欧美日本| 国产精品视频yy9299一区| 欧美女人交a| 欧美成人午夜剧场免费观看| 久久久久久久久久看片|