MFC多线程的使用(CWinThread类)

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);
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值