MFC线程中断和重启

给程序写了一个显示实时数据的功能,用的是mfc线程的方式AfxBeginThread。这个功能的入口一共有三个,分别是第一次点击按钮进入该功能,第多次点击按钮进入该功能,和点击保存当前数据按钮并完成采样之后自动进入该功能。由于在保存当前数据的过程中,需要中断实时数据显示的操作,就涉及到线程的中断和重启:

DWord CWinThread::ResumeThread();//重启线程
DWord CWinThread::SuspendThread();//中断(挂起)线程

为了让三种进入该功能的途径都能正常运行,需要先厘清这三种途径的运行过程。

  1. 首次点击按钮,用AfxBeginThread开启线程并执行;
  2. 重复点击按钮,为了适用算法参数等修改,需要先suspend再resume;
  3. 点击一次或多次按钮后,点击采样按钮,采样执行完毕后进入该功能,需要在点击采样按钮之后suspend,在进入该功能之前resume;
  4. 不点击该按钮,直接点击采样按钮,完毕后进入该功能,需要开启线程并执行。

需要进行判断的地方有两处:第几次点击该按钮;按钮功能是通过点击进入还是采样完毕后直接进入。
点击按钮次数的判断通过在对话框类里添加一个成员变量nNumClicked并在按钮响应函数里进行判断实现;功能进入方式的判断转化为根据中断线程的次数判断需要重启的次数。为了让线程能在后续继续启动,需要保证重启的次数等于被中断的次数。
按钮响应函数:

void CLivoxFileSaveDlg::OnBnClickedBtnRealTimeData()
{	
	if (nBtnRealTimeClicked > 0)//连续点击实时显示按钮
	{
		DWORD d = m_WinThread->SuspendThread();
		Sleep(10);
		if(d==-1)
			cout<<"failed to suspend thread.\n";
		else
		{
			for(int i=0;i<=d;i++)
				m_WinThread->ResumeThread();
		}
	}
	else//点击一次实时显示按钮
	{ 
		m_WinThread = AfxBeginThread(ShowRealTimeData, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
		nBtnRealTimeClicked++;
	}
	return;
}

数据采样按钮响应函数做如下修改:

if(m_WinThread != NULL&&m_WinThread->m_nThreadID != 0)
		m_WinThread->SuspendThread();
……
……
OnBnClickedBtnRealTimeData();	

不过suspend和resume方法并不安全,所以还是需要寻找其他方法。
参考:线程SuspendThread() ResumeThread()的使用

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值