[MFC]线程的挂起与恢复
实例——线程的挂起与恢复
关键代码:
CDemoThreadDlg::CDemoThreadDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDemoThreadDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); pThread=NULL; mThreadParam.nData=0; } CDemoThreadDlg::~CDemoThreadDlg() { if (pThread) { ::WaitForSingleObject(pThread->m_hThread,INFINITE); delete pThread; pThread=NULL; } } //启动线程按钮事件 void CDemoThreadDlg::OnBnClickedButtonStart() { if (pThread) { DWORD exitCode=0; if (::GetExitCodeThread(pThread->m_hThread,&exitCode)) { if (exitCode == STILL_ACTIVE) { AfxMessageBox(L"线程已经启动。"); return; } } } mThreadParam.hWnd=m_hWnd; pThread=AfxBeginThread(ThreadFun,&mThreadParam,THREAD_PRIORITY_ABOVE_NORMAL,0,CREATE_SUSPENDED); pThread->m_bAutoDelete=FALSE; pThread->ResumeThread(); } //线程函数 UINT ThreadFun(LPVOID pParam) { THREAD_PARAM* pThreadParam=(THREAD_PARAM*)pParam; for (int i=0;i<50;i++) { pThreadParam->nData++; ::PostMessage(pThreadParam->hWnd,WM_MSG,0,0); Sleep(100); } return 0; } //挂起线程按钮事件 void CDemoThreadDlg::OnBnClickedButtonSuspend() { if (pThread) { pThread->SuspendThread(); /* DWORD SuspendThread( ); 返回值:如果成功,则返回线程原来的挂起计数值;否则返回0xFFFFFFFF。 说明: 增加当前线程的挂起计数。如果线程的挂起计数大于零,则该线程将不被执行。线程可以通过调用ResumeThread成员函数恢复执行。 */ } } //恢复线程按钮事件 void CDemoThreadDlg::OnBnClickedButtonResume() { if (pThread) { pThread->ResumeThread(); /* DWORD ResumeThread( ); 返回值:如果成功,则返回线程的原挂起计数值;否则返回0xFFFFFFFF。如果返回值为零,则表示当前线程没有被挂起。如果返回值为1,线程被挂起,但是即将重新启动。任何大于1的返回值都表明线程将继续挂起。 说明: 调用这个函数以使被SuspendThread成员函数所挂起的线程恢复执行,或者使用CREATE_SUSPENDED标志创建的线程恢复执行。当前线程的挂起计数被减小1。如果挂起计数被减小到0,线程将恢复执行;否则线程继续被挂起。 */ } }
结果图: