亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

VC中CWinThread類以及和createthread API的區別分析

2020-01-26 15:12:04
字體:
來源:轉載
供稿:網友

本文實例講述了VC中CWinThread類以及和createthread API的區別分析,分享給大家供大家參考。具體分析如下:

CWinThread

CObject
 └CCmdTarget
    └CWinThread

CWinThread對象代表在一個應用程序內運行的線程。運行的主線程通常由CWinApp的派生類提供;CWinApp由CWinThread派生。另外,CWinThread對象允許一給定的應用程序擁有多個線程。

CWinThread支持兩種線程類型:工作者線程(Worker Thread)和用戶界面線程(UI thread)。工作者線程沒有收發消息的功能(沒有消息隊列):例如,在電子表格應用程序中進行后臺計算的線程。

用戶界面線程具有收發消息的功能,并處理從系統收到的消息。CWinApp及其派生類是用戶界面線程的例子。其它用戶界面線程也可由CWinThread直接派生。

CWinThread類的對象存在于線程的生存期。如果你希望改變這個特性,將m_bAutoDelete設為FALSE。

要使你的代碼和MFC是完全線程安全的,CWinThread類是完全必要的??蚣苁褂玫挠脕砭S護與線程相關的信息的線程局部數據由CWinThread對象管理。由于依賴CWinThread來處理線程局部數據(Thread Local Storage),任何使用MFC的線程必須由MFC創建。例如,由運行時函數_beginthreadex創建的線程不能使用任何MFC API。

為了創建一個線程,調用AfxBeginThread函數。根據你需要工作者線程還是用戶界面線程,有兩種調用AfxBeginThread的格式。如果你需要用戶界面線程,則將指向你的CWinThread派生類的CRuntimeClass的指針傳遞給AfxBeginThread。如果你需要創建工作者線程,則將指向控制函數的指針和控制函數的參數傳遞給AfxBeginThread。對于工作者線程和用戶界面線程,你可以指定可選的參數來修改優先級,堆棧大小,創建標志和安全屬性。

AfxBeginThread線程將返回指向新的CWinThread對象的指針。
與調用AfxBeginThread相反,你可以構造一個CWinThread派生類的對象,然后調用CreateThread。如果你需要在連續創建和終止線程的執行之間重復使用CWinThread對象,這種兩步構造方法非常有用。

CWinThread類成員

數據成員

m_bAutoDelete                      指定線程結束時是否要銷毀對象 
m_hThread                             當前線程的句柄 
m_nThreadID                         當前線程的ID 
m_pMainWnd                         保存指向應用程序的主窗口的指針 
m_pActiveWnd                       指向容器應用程序的主窗口,當一個OLE服務器被現場激活時 

構造函數

CWinThread                           構造一個CWinThread對象 
CreateThread                          開始一個CWinThread對象的執行 

操作

GetMainWnd                          查詢指向線程主窗口的指針 
GetThreadPriority                    獲取當前線程的優先級 
PostThreadMessage               向另外的CWinThread對象傳遞一條消息 
ResumeThread                       減少一個線程的掛起計數 
SetThreadPriority                   設置當前線程的優先級 
SuspendThread                     增加一個線程的掛起計數 

可重載函數

ExitInstance                         重載以進行線程終止時的清理工作 
InitInstance                           重載以實現線程實例的初始化 
OnIdle                                   重載以進行線程特定的空閑操作 
PreTranslateMessage           在消息被發送到Windows函數TranslateMessage和DispatchMessage之前過濾消息 
IsIdleMessage                      檢測特定的消息 
ProcessWndProcException    截獲線程消息和命令處理函數出現的所有未處理的異常 
ProcessMessageFilter           在特定的消息到達應用程序之前截獲消息 
Run                                       線程的具有消息收發功能的控制函數,可重載以定制缺省的消息循環 

AfxBeginThread和CreateThread具體區別

具體說來,CreateThread這個 函數是windows提供給用戶的 API函數,是SDK的標準形式.
AfxBeginThread,是編譯器對原來的CreateThread函數的封裝,用與MFC.
而_beginthread是C的運行庫函數。               
在使用AfxBeginThread時,線程函數的定義為:UINT  _yourThreadFun(LPVOID   pParam)
在使用CreateThread時,線程的函數定義為:  DWORD  WINAPI  _yourThreadFun(LPVOID pParameter)。

兩個的實質都是一樣的,不過AfxBeginThread返回一個CWinThread的指針,就是說他會new一個CWinThread對象,而且這個對象是自動刪除的(在線程運行結束時),給我們帶來的不便就是無法獲得它的狀態,因為隨時都有可能這個指針指向的是一個已經無效的內存區域,所以使用時(如果需要了解它的運行狀況的話)首先CREATE_SUSPENDED讓他掛起,然后m_bAutoDelete=FALSE,接著才ResumeThread,最后不要了delete那個指針。

CreatThread就方便多了,它返回的是一個句柄,如果你不使用CloseHandle的話就可以通過他安全的了解線程狀態,最后不要的時候CloseHandle,Windows才會釋放資源(線程內核對象).
下面我們就來看一下AfxBeginThread函數的內部實現:

復制代碼 代碼如下:
//啟動worker線程
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,
    int nPriority, UINT nStackSize, DWORD dwCreateFlags,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{

         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;
}

//啟動UI線程
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{

        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;
}

主要創建函數是

復制代碼 代碼如下:
pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,lpSecurityAttrs))

也就是

復制代碼 代碼如下:
CWinThread::CreateThread
。

希望本文所述對大家的VC程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91探花福利精品国产自产在线| xxxxx成人.com| 久久久久久这里只有精品| 欧美国产日韩在线| 国产91色在线播放| 57pao国产精品一区| 色在人av网站天堂精品| 一区二区三区视频免费在线观看| 日韩经典中文字幕在线观看| 亚洲国产私拍精品国模在线观看| 色悠悠久久88| 综合网日日天干夜夜久久| 国产精品激情av在线播放| 久久青草精品视频免费观看| 亚洲www永久成人夜色| 51视频国产精品一区二区| 欧美一级大胆视频| 国产精品入口日韩视频大尺度| 欧美日韩精品在线播放| 亚洲人成电影在线| 日韩成人在线视频| 国产精品福利片| 色多多国产成人永久免费网站| 欧美肥婆姓交大片| 国产精品色午夜在线观看| 久久久久久国产精品久久| 国产精品1区2区在线观看| 日韩欧美国产激情| 一区二区三区国产在线观看| y97精品国产97久久久久久| 国产91在线高潮白浆在线观看| 色综合久综合久久综合久鬼88| 国产亚洲在线播放| 亚洲欧美日本伦理| 久久精品精品电影网| 欧美韩日一区二区| 亚洲精品日韩丝袜精品| 国产精品福利在线观看网址| 91精品啪aⅴ在线观看国产| 亚洲高清久久网| 欧美性xxxx在线播放| 92版电视剧仙鹤神针在线观看| 欧美成人激情在线| 成人欧美一区二区三区在线| 综合激情国产一区| 国产女人18毛片水18精品| 亚洲第一免费播放区| 日韩欧美在线字幕| 91久久夜色精品国产网站| 日韩中文字幕精品视频| 国产精品普通话| 国产香蕉一区二区三区在线视频| 欧美视频中文在线看| 国产欧美日韩中文字幕在线| 久久综合久久88| 亚洲色图狂野欧美| 日韩黄色高清视频| 中文字幕少妇一区二区三区| 性色av一区二区三区在线观看| 色一区av在线| 日韩av在线一区| 91成人福利在线| 国产一区二区久久精品| 伊人久久综合97精品| 一本色道久久88亚洲综合88| 国产精品日韩欧美大师| 国产精品视频自在线| 欧美亚洲另类视频| 日韩一区二区三区在线播放| 久久中文字幕在线视频| 欧美日本高清一区| 久久偷看各类女兵18女厕嘘嘘| 国产精品精品久久久| 日韩三级影视基地| 欧美日韩久久久久| 久久伊人91精品综合网站| 欧美激情手机在线视频| 伊人伊人伊人久久| 国产有码在线一区二区视频| 欧美伦理91i| 精品成人乱色一区二区| 欧美制服第一页| 91久久国产综合久久91精品网站| 欧美大片在线看| 亚洲国产欧美日韩精品| 欧美日韩精品在线视频| 国产脚交av在线一区二区| 日韩免费精品视频| 欧美国产高跟鞋裸体秀xxxhd| 国产精品va在线播放我和闺蜜| 日韩欧中文字幕| 午夜欧美不卡精品aaaaa| 国产欧美一区二区三区视频| 国产精品视频播放| 日韩免费在线视频| 久久精品成人一区二区三区| 国产一区二区三区三区在线观看| 91在线免费观看网站| 美女av一区二区三区| 久精品免费视频| 亚洲人成网站在线播| 亚洲欧洲在线看| 欧美成人精品h版在线观看| 俺去亚洲欧洲欧美日韩| 91精品国产色综合久久不卡98口| 日韩在线激情视频| 清纯唯美亚洲综合| 亚洲国产中文字幕在线观看| 欧美激情精品久久久久久免费印度| 主播福利视频一区| 国产精品日韩专区| 琪琪第一精品导航| 国产一区二区三区丝袜| 色天天综合狠狠色| 欧美大片免费观看在线观看网站推荐| 日本道色综合久久影院| 国产成人一区二区在线| 国产精品一区av| 欧美日韩激情视频| 欧美在线观看www| 亚洲欧美一区二区三区情侣bbw| 亚洲欧洲日本专区| 国产在线日韩在线| 色老头一区二区三区在线观看| 91理论片午午论夜理片久久| 丝袜情趣国产精品| 欧美精品在线第一页| 欧美与欧洲交xxxx免费观看| 尤物九九久久国产精品的分类| 色小说视频一区| 热草久综合在线| 欧美专区福利在线| 久久久精品国产| 亚洲成人av在线| 亚洲国产精品va在看黑人| 狠狠久久五月精品中文字幕| 黄色一区二区三区| 亚洲免费中文字幕| 精品视频在线播放免| 91精品啪aⅴ在线观看国产| 欧美伊久线香蕉线新在线| 国产欧美在线视频| 欧美午夜激情视频| 在线丨暗呦小u女国产精品| 国产精品久久久久久久一区探花| 欧美成人免费大片| 国产欧美一区二区三区在线| 91精品国产色综合久久不卡98| 亚洲国产欧美一区| 九九热r在线视频精品| 深夜福利国产精品| 日韩电影中文 亚洲精品乱码| 亚洲第一天堂无码专区| 久久久国产一区二区| 国产亚洲精品高潮| 韩国v欧美v日本v亚洲| 91久久久久久久久久久久久| 午夜精品视频在线| 国产成人av网| 国产精品99久久久久久久久久久久| 亚洲人成电影网| 国产日本欧美在线观看| 国产精品久久久久久久久久久久| 日韩精品久久久久久久玫瑰园|