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

    xiaoxiao2026-01-07  7

    场景:按下自动运行按钮后,数据不停的从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置为无信号状态,保证本线程访问资源时,其他线程不会同时访问。
    转载请注明原文地址: https://ju.6miu.com/read-1305742.html
    最新回复(0)