2023年6月22日发(作者:)
c++线程类linux,C++封装线程类的实现⽅法本⽂实例讲述了C++封装线程类的实现⽅法。分享给⼤家供⼤家参考。具体⽅法如下:// 给主窗⼝的通知消息#define WM_CUTTERSTART WM_USER + 100 // wParam == xxx lParam==xxxx/*外⾯调⽤这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx() Resumexxx() Stopxxx()*//*m_bContinue在真正的⼯作代码DoSomething中检测,在退出和类析构时设为FALSE,在Reset时和构造时设为TRUE 标志内部是否继续⼯作m_bRunning 在Startxxx Suspendxxx Resumexxx 中检测,在构造时和Reset时设为FALSE,在_ThreadEntry得到WaitForSingleObject时设为TRUE外部通过IsRunning得到是否正在运⾏*/class CMyClass{public:// ⼯作退出代码enum ExitCode{exitSuccess, // 成功完成任务exitUserForce, // ⽤户终⽌exitError, // 源⽂件出错};// 构造函数CMyClass(HWND hWndNotify); //接收窗⼝句柄// 属性 对外开放BOOL IsRunning() const { return m_bRunning; } //对外// 操作 对外开放BOOL Startxxx(xxx);BOOL Suspendxxx();BOOL Resumexxx();void Stopxxx();// 具体实现public:~CFileCutter(); //析构protected:// 重置参数信息和状态标志void Reset();// 真正的⼯作核⼼代码void DoSomething();// ⼯作线程UINT friend _ThreadEntry(LPVOID lpParam);// 状态标志BOOL m_bContinue; // 是否继续⼯作 DoSomething中检测,如果在DoSomething中不m_bContinue,就中⽌⼯作BOOL m_bRunning; // 是否处于⼯作状态// 同步以上两组数据CRITICAL_SECTION m_cs; // Data gardprivate:// 对象的⽣命周期全局有效的数据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;// 创建等待事件对象m_hWorkEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);// 创建⼯作线程m_pThread = AfxBeginThread(_CutterEntry, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);m_pThread->m_bAutoDelete = FALSE;m_pThread->ResumeThread();// 初始化⼯作期间有效变量m_bContinue = TRUE; //⼯作函数不被打断,这个标志就为TRUE,在⼯作函数中检测这个值m_bRunning = FALSE; //线程函数在WaitForSingleObject,所以还是FALSE// 创建关键代码段::InitializeCriticalSection(&m_cs);}// 内部⼯作线程UINT _ThreadEntry(LPVOID lpParam){// 得到CMyClass对象的指针CMyClass* pMyClass = (CMyClass*)lpParam;// 循环处理⽤户的⼯作请求while(::WaitForSingleObject(pMyClass->m_hWorkEvent, INFINITE) == WAIT_OBJECT_0 &&!pMyClass->m_bExitThread){// 设置状态标志,说明正在⼯作::EnterCriticalSection(&pCutter->m_cs);pMyClass->m_bRunning = TRUE;::LeaveCriticalSection(&pCutter->m_cs);// 开始真正的⼯作pMyClass->DoSomething()// 准备接受新的⼯作任务pMyClass->Reset(); //这个函数中设置⼀下各标志的值}return 0;}void CMyClass::Reset(){::EnterCriticalSection(&m_cs);// 重置状态标志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);// 防⽌线程处于暂停状态ResumeCutter();}//-------------------------实现代码-------------------------////真正的⼯作代码void CMyClass::DoSomething(){// 通知⽤户,出错::PostMessage(m_hWndNotify, wm_xxx, exitError, 0);// 通知⽤户,开始⼯作::PostMessage(m_hWndNotify, WM_XXXSTART, 0, XX);// ⾸先判断是否要求终⽌执⾏if(!m_bContinue){//释放资源xxxx;if(!m_bExitThread)::PostMessage(m_hWndNotify, WM_XXXXSTOP, XX, XX);return;}// 通知⽤户,⼯作完成::PostMessage(m_hWndNotify, WM_CUTTERSTOP, exitSuccess, nCompleted);}希望本⽂所述对⼤家的C++程序设计有所帮助。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687426021a9158.html
评论列表(0条)