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

浙公网安备 33010602011771号