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

结果图: [MFC]线程的挂起与恢复_第1张图片

你可能感兴趣的:([MFC]线程的挂起与恢复)