1、首先在对话框.h文件(对话框类内)中声明变量
//多线程
CWinThread* m_ThreadXXX;
//控制线程事件句柄(选择性使用)
HANDLE m_hControlThreadEnvent
2、声明及定义线程函数
可以声明在类内,也可以在内外,区别在于类内必须静态。优先选择类内,因为后续可以访问私有变量。
声明:
static UINT ThreadFuncXXX(LPVOID lParam);
定义:
UINT CXXXDlg::ThreadFuncXXX(LPVOID lpParam)
{
CXXXDlg* dlg = (CXXXDlg*)lpParam;
//用来接收事件信号
DWORD dwRetVal;
while (true)
{
//等待那个信号(每隔40毫秒)
dwRetVal = WaitForSingleObject(dlg->m_hControlThreadEnvent, 40);
//如果那个值是WAIT_OBJECT_0,表示需要结束线程函数
if (dwRetVal == WAIT_OBJECT_0)
{
DWORD dwExitCode;
//关闭事件句柄
CloseHandle(dlg->m_hControlThreadEnvent);
dlg->m_hControlThreadEnvent = NULL;
//获得退出码
GetExitCodeThread(dlg->m_ThreadXXX, &dwExitCode);
//结束线程
AfxEndThread(dwExitCode, FALSE);
}
/*******************************************/
/*********这里添加while循环要执行的功能*********/
/*******************************************/
}
return 0;
}
3、线程的抛出、挂起、唤醒和终止
如果希望在某个地方发出一个事件来控制线程的终止,那么就提前创建一个线程控制事件
//创建线程控制事件
m_hControlThreadEnvent = CreateEventA(NULL, FALSE, FALSE, NULL);
抛出线程,传入this指针,后续强制转换为对话框指针,用来操作变量
//抛出线程
m_ThreadXXX = (CWinThread*)AfxBeginThread(ThreadFuncXXX, this);
使线程挂起
//使线程挂起
m_ThreadXXX ->SuspendThread();
唤醒线程
//唤醒线程
m_ThreadXXX ->ResumeThread();
终止线程
①设置线程控制事件句柄有信号(前提是之前创建了句柄)
//终止线程
SetEvent(m_hControlThreadEnvent);
②调用AfxEndThread函数
DWORD dwExitCode;
//获得退出码
GetExitCodeThread(dlg->m_ThreadXXX, &dwExitCode);
//结束线程
AfxEndThread(dwExitCode, FALSE);