欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++封裝線程類(lèi)的實(shí)現(xiàn)方法

 更新時(shí)間:2014年10月15日 16:50:55   投稿:shichen2014  
這篇文章主要介紹了C++封裝線程類(lèi)的實(shí)現(xiàn)方法,實(shí)例介紹了針對(duì)線程的創(chuàng)建、調(diào)用等方法的封裝操作,需要的朋友可以參考下

本文實(shí)例講述了C++封裝線程類(lèi)的實(shí)現(xiàn)方法。分享給大家供大家參考。具體方法如下:

復(fù)制代碼 代碼如下:
// 給主窗口的通知消息 
#define WM_CUTTERSTART WM_USER + 100    // wParam == xxx  lParam==xxxx 
 
/* 
外面調(diào)用這個(gè)類(lèi)時(shí),只需要IsRunning() Startxxx(xxx) Suspendxxx()   Resumexxx() Stopxxx() 
*/ 
 
/* 
m_bContinue在真正的工作代碼DoSomething中檢測(cè),在退出和類(lèi)析構(gòu)時(shí)設(shè)為FALSE,在Reset時(shí)和構(gòu)造時(shí)設(shè)為T(mén)RUE  標(biāo)志內(nèi)部是否繼續(xù)工作 
m_bRunning  在Startxxx Suspendxxx Resumexxx 中檢測(cè),在構(gòu)造時(shí)和Reset時(shí)設(shè)為FALSE,在_ThreadEntry得到WaitForSingleObject時(shí)設(shè)為T(mén)RUE 
            外部通過(guò)IsRunning得到是否正在運(yùn)行 
 
*/ 
class CMyClass 

public: 
    // 工作退出代碼 
    enum ExitCode{  
        exitSuccess,    // 成功完成任務(wù) 
        exitUserForce,  // 用戶(hù)終止 
        exitError,  // 源文件出錯(cuò) 
    }; 
 
    // 構(gòu)造函數(shù) 
    CMyClass(HWND hWndNotify); //接收窗口句柄 
 
    // 屬性 對(duì)外開(kāi)放 
    BOOL IsRunning() const { return m_bRunning; }  //對(duì)外 
 
    // 操作  對(duì)外開(kāi)放 
    BOOL Startxxx(xxx); 
    BOOL Suspendxxx(); 
    BOOL Resumexxx(); 
    void Stopxxx(); 
 
    // 具體實(shí)現(xiàn) 
public: 
    ~CFileCutter(); //析構(gòu) 
 
protected: 
    // 重置參數(shù)信息和狀態(tài)標(biāo)志 
    void Reset(); 
    // 真正的工作核心代碼 
    void DoSomething(); 
 
    // 工作線程 
    UINT friend _ThreadEntry(LPVOID lpParam); 
 
    // 狀態(tài)標(biāo)志 
    BOOL m_bContinue;   //  是否繼續(xù)工作 DoSomething中檢測(cè),如果在DoSomething中不m_bContinue,就中止工作 
    BOOL m_bRunning;    //  是否處于工作狀態(tài) 
 
    // 同步以上兩組數(shù)據(jù) 
    CRITICAL_SECTION m_cs;  // Data gard 
 
private: 
    // 對(duì)象的生命周期全局有效的數(shù)據(jù) 
    HWND m_hWndNotify;  // 接受消息通知事件的窗口句柄 
    HANDLE m_hWorkEvent;    // 通知開(kāi)始工作的事件對(duì)象句柄 
    CWinThread* m_pThread;  // 工作線程 
    BOOL m_bSuspend;    // 暫停標(biāo)志 
    BOOL m_bExitThread; // 退出標(biāo)志 
}; 
 
//構(gòu)造 
CMyClass::CMyClass() 

    // 初始化全局有效變量 
 
    m_hWndNotify = hWndNotify; 
    m_bExitThread = FALSE; 
    m_bSuspend = FALSE; 
    // 創(chuàng)建等待事件對(duì)象 
    m_hWorkEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL); 
    // 創(chuàng)建工作線程 
    m_pThread = AfxBeginThread(_CutterEntry, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); 
    m_pThread->m_bAutoDelete = FALSE; 
    m_pThread->ResumeThread(); 
 
    // 初始化工作期間有效變量 
    m_bContinue = TRUE;  //工作函數(shù)不被打斷,這個(gè)標(biāo)志就為T(mén)RUE,在工作函數(shù)中檢測(cè)這個(gè)值 
    m_bRunning  = FALSE;  //線程函數(shù)在WaitForSingleObject,所以還是FALSE 
    // 創(chuàng)建關(guān)鍵代碼段 
    ::InitializeCriticalSection(&m_cs);  

 
// 內(nèi)部工作線程 
UINT _ThreadEntry(LPVOID lpParam) 

    // 得到CMyClass對(duì)象的指針 
    CMyClass* pMyClass = (CMyClass*)lpParam; 
 
    // 循環(huán)處理用戶(hù)的工作請(qǐng)求 
    while(::WaitForSingleObject(pMyClass->m_hWorkEvent, INFINITE) == WAIT_OBJECT_0 &&  
        !pMyClass->m_bExitThread) 
    { 
        // 設(shè)置狀態(tài)標(biāo)志,說(shuō)明正在工作 
        ::EnterCriticalSection(&pCutter->m_cs); 
        pMyClass->m_bRunning = TRUE; 
        ::LeaveCriticalSection(&pCutter->m_cs); 
 
        // 開(kāi)始真正的工作 
        pMyClass->DoSomething() 
 
        // 準(zhǔn)備接受新的工作任務(wù) 
        pMyClass->Reset(); //這個(gè)函數(shù)中設(shè)置一下各標(biāo)志的值 
    } 
 
    return 0; 

 
void CMyClass::Reset() 

    ::EnterCriticalSection(&m_cs); 
 
    // 重置狀態(tài)標(biāo)志 
    m_bContinue = TRUE; 
    m_bRunning = FALSE; 
 
    ::LeaveCriticalSection(&m_cs); 

 
CMyClass::~CMyClass() 

    // 設(shè)置結(jié)束標(biāo)志 
    m_bExitThread = TRUE; 
 
    // 設(shè)置強(qiáng)制退出標(biāo)志 
    ::EnterCriticalSection(&m_cs); 
    m_bContinue = FALSE; 
    ::LeaveCriticalSection(&m_cs); 
 
    //**********很重要****************************************** 
    // 防止線程在m_hWorkEvent事件上等待 
    ::SetEvent(m_hWorkEvent); 
 
    // 確保工作線程結(jié)束 
    ::WaitForSingleObject(m_pThread->m_hThread, INFINITE); 
 
    // 釋放所有資源 
    ::CloseHandle(m_hWorkEvent); 
    ::DeleteCriticalSection(&m_cs);  
    delete m_pThread; 

 
BOOL CMyClass::Startxxx(xxx) 

    if(m_bRunning) 
        return FALSE; 
 
    // 通知線程開(kāi)始工作 
    ::SetEvent(m_hWorkEvent); 
    return TRUE; 

 
BOOL CMyClass::Suspendxxx() 

    if(!m_bRunning) 
        return FALSE; 
 
    // 暫停工作線程 
    if(!m_bSuspend) 
    { 
        m_pThread->SuspendThread(); 
        m_bSuspend = TRUE; 
    } 
    return TRUE; 

 
BOOL CMyClass::Resumexxx() 

    if(!m_bRunning) 
        return FALSE; 
 
    // 喚醒工作線程 
    if(m_bSuspend) 
    { 
        m_pThread->ResumeThread(); 
        m_bSuspend = FALSE; 
    } 
    return TRUE; 

 
void CMyClass::Stopxxx() 

    // 設(shè)置強(qiáng)制退出標(biāo)志 
    ::EnterCriticalSection(&m_cs); 
    m_bContinue = FALSE; 
    ::LeaveCriticalSection(&m_cs); 
 
    // 防止線程處于暫停狀態(tài) 
    ResumeCutter(); 

 
//-------------------------實(shí)現(xiàn)代碼-------------------------// 
 
//真正的工作代碼 
void CMyClass::DoSomething() 

    // 通知用戶(hù),出錯(cuò) 
    ::PostMessage(m_hWndNotify, wm_xxx, exitError, 0); 
 
    // 通知用戶(hù),開(kāi)始工作 
    ::PostMessage(m_hWndNotify, WM_XXXSTART, 0, XX); 
     
    // 首先判斷是否要求終止執(zhí)行 
    if(!m_bContinue) 
    { 
        //釋放資源 
        xxxx; 
 
        if(!m_bExitThread) 
            ::PostMessage(m_hWndNotify, WM_XXXXSTOP, XX, XX); 
        return; 
    } 
    // 通知用戶(hù),工作完成 
    ::PostMessage(m_hWndNotify, WM_CUTTERSTOP, exitSuccess, nCompleted); 
}

希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • c++ Qt信號(hào)槽原理

    c++ Qt信號(hào)槽原理

    這篇文章主要介紹了c++ Qt信號(hào)槽原理的相關(guān)資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++ VTK實(shí)例之高斯隨機(jī)數(shù)的生成

    C++ VTK實(shí)例之高斯隨機(jī)數(shù)的生成

    這篇文章主要介紹了VTK的一個(gè)實(shí)例之高斯隨機(jī)數(shù)的生成,本文演示了從一個(gè)平均數(shù)是0.0和標(biāo)準(zhǔn)偏差是2.2的高斯分布中隨機(jī)生成3個(gè)隨機(jī)數(shù)。感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • C++在C語(yǔ)言基礎(chǔ)之上增強(qiáng)的幾個(gè)實(shí)用特性總結(jié)

    C++在C語(yǔ)言基礎(chǔ)之上增強(qiáng)的幾個(gè)實(shí)用特性總結(jié)

    這篇文章主要介紹了C++在C語(yǔ)言基礎(chǔ)之上增強(qiáng)的幾個(gè)實(shí)用特性總結(jié),包括C++中更強(qiáng)的類(lèi)型約束以及結(jié)構(gòu)體方面等一些更加高級(jí)的特性,需要的朋友可以參考下
    2016-03-03
  • C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊的六種模式詳程建議收藏

    C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊的六種模式詳程建議收藏

    遲早一定會(huì)掛掉的俄羅斯方塊,為什么至今仍是世界游戲之王?它是怎么編寫(xiě)的?本文將給大家詳細(xì)介紹六種模式的實(shí)現(xiàn),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2022-02-02
  • C++卸載程序功能示例

    C++卸載程序功能示例

    用C++寫(xiě)一個(gè)自己的卸載程序來(lái)完成程序的卸載工作,同時(shí)運(yùn)行后要?jiǎng)h除卸載程序本身,并刪除卸載程序所在的文件夾
    2013-11-11
  • 淺析多維數(shù)組的下標(biāo)重載

    淺析多維數(shù)組的下標(biāo)重載

    貼一下實(shí)現(xiàn)基本功能的代碼吧,像越界檢測(cè),及其他功能就沒(méi)寫(xiě)了,只要體現(xiàn)了思路,其他的功能好加
    2013-09-09
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言實(shí)現(xiàn)單鏈表反轉(zhuǎn)

    C語(yǔ)言實(shí)現(xiàn)單鏈表反轉(zhuǎn)

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)單鏈表反轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • VC雙畫(huà)布消除屏幕閃爍實(shí)例詳解

    VC雙畫(huà)布消除屏幕閃爍實(shí)例詳解

    這篇文章主要介紹了VC雙畫(huà)布消除屏幕閃爍實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán)

    C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論