[MFC]线程的挂起与恢复

来源:互联网 发布:厦门大学软件学院 编辑:程序博客网 时间:2024/05/12 23:33

实例——线程的挂起与恢复

关键代码:

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,线程将恢复执行;否则线程继续被挂起。*/}}

结果图:

原创粉丝点击