[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]线程的挂起与恢复

 

 

你可能感兴趣的:(mfc)