欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

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

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

public: 
    // 工作退出代碼 
    enum ExitCode{  
        exitSuccess,    // 成功完成任務(wù) 
        exitUserForce,  // 用戶終止 
        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)志就為TRUE,在工作函數(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)處理用戶的工作請(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() 

    // 通知用戶,出錯(cuò) 
    ::PostMessage(m_hWndNotify, wm_xxx, exitError, 0); 
 
    // 通知用戶,開(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; 
    } 
    // 通知用戶,工作完成 
    ::PostMessage(m_hWndNotify, WM_CUTTERSTOP, exitSuccess, nCompleted); 
}

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

上一篇:C++取得本機(jī)IP的方法

欄    目:C語(yǔ)言

下一篇:C++模板類的用法

本文標(biāo)題:C++封裝線程類的實(shí)現(xiàn)方法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3231.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有