雷火电竞-中国电竞赛事及体育赛事平台

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

C語言

當前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

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

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

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

    // 初始化全局有效變量 
 
    m_hWndNotify = hWndNotify; 
    m_bExitThread = FALSE; 
    m_bSuspend = FALSE; 
    // 創(chuàng)建等待事件對象 
    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ù)不被打斷,這個標志就為TRUE,在工作函數(shù)中檢測這個值 
    m_bRunning  = FALSE;  //線程函數(shù)在WaitForSingleObject,所以還是FALSE 
    // 創(chuàng)建關鍵代碼段 
    ::InitializeCriticalSection(&m_cs);  

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

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

 
void CMyClass::Reset() 

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

 
CMyClass::~CMyClass() 

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

 
BOOL CMyClass::Startxxx(xxx) 

    if(m_bRunning) 
        return FALSE; 
 
    // 通知線程開始工作 
    ::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() 

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

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

    // 通知用戶,出錯 
    ::PostMessage(m_hWndNotify, wm_xxx, exitError, 0); 
 
    // 通知用戶,開始工作 
    ::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); 
}

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

上一篇:C++取得本機IP的方法

欄    目:C語言

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

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

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3231.html

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

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

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

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