理解事件Event在线程同步中的应用

场景:按下自动运行按钮后,数据不停的从1累计到50,为一个完整周期,该周期不停的循环;当按下停止按钮后,数据完成当前周期后,停止变化。
细节:
1.初始化后,自动运行按钮有效,自动运行按钮无效;
2.按下自动运行后,将自动运行按钮无效,同时停止运行按钮有效;
3.若不按停止运行按钮,Edit框的数据将每50个一次循环;
4.按下停止运行按钮后,数据执行完当前周期后停止。

在对话框类中需要添加的变量
	int n_Count;
	afx_msg void OnBnClickedButtonStart();
	CEvent eAutoRunExit;
	static UINT AutoRunThread(LPVOID lParam);
	afx_msg void OnBnClickedButtonStop();
	bool FlagAutoRun;

自动运行按钮代码
void CCEventSyncDlg::OnBnClickedButtonStart()
{
	// TODO: 在此添加控件通知处理程序代码
	AfxBeginThread(AutoRunThread, this, THREAD_PRIORITY_IDLE, 0, 0);
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);

}

自动运行线程代码
UINT CCEventSyncDlg::AutoRunThread(LPVOID lParam)
{
	CCEventSyncDlg *pMainDlg = (CCEventSyncDlg *)lParam;
	pMainDlg->FlagAutoRun = 1;
	while (pMainDlg->FlagAutoRun)
	{
		int i = 0;
		for (; i <= 50;i++)
		{

			pMainDlg->n_Count = i;
			CString string;
			string.Format(_T("%d"), pMainDlg->n_Count);
			pMainDlg->SetDlgItemTextW(IDC_EDIT_COUNT, string);
			Sleep(100);
		}		
	}
		
	pMainDlg->GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
	pMainDlg->GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
	pMainDlg->eAutoRunExit.SetEvent();       //线程结束时,把事件对象设置有信号状态
	return 0;
}

停止运行按钮代码
void CCEventSyncDlg::OnBnClickedButtonStop()
{
	// TODO: 在此添加控件通知处理程序代码
	FlagAutoRun = FALSE;
	GetDlgItem(IDC_BUTTON_STOP)->SetWindowTextW(_T("等待停止"));
	while (WaitForSingleObject(eAutoRunExit.m_hObject, 20) != WAIT_OBJECT_0)
	{
		MSG msg;
		while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	GetDlgItem(IDC_BUTTON_STOP)->SetWindowTextW(_T("停止运行"));
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
}

WaitForSingleObject 函数在返回后会把event置为无信号状态,保证本线程访问资源时,其他线程不会同时访问。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值