场景:按下自动运行按钮后,数据不停的从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置为无信号状态,保证本线程访问资源时,其他线程不会同时访问。