230上位机VC MFC使用事件对象使线程同步
230上位机VC MFC使用事件对象使线程同步 功能展示 程序同时启动两个线程访问同一变量时就得控制线程的访问顺序,防止出现意外,使多个线程按指定的顺序执行任意就叫线程的同步,我们当前例程使用一个事件对象,实现了线程的同步,效果如图,点击正常执行两线程和使用事件对象实现两线程同步,可以看出线程向编程框写入文本的不同顺序; 要点提示 例程使用事件对象Cevent构造函数默认有参数创建实现,其默认构造原型为 CEvent( BOOL bInitiallyOwn /* = FALSE */ , //用来指定事件对象初始状态是否为发信状态(默认值为未发信) BOOL bManualReset /* = FALSE */ , //用来指定创建的事件对象是自动事件还是手动事件对象(默认值为自动事件对象) LPCTSTR lpszNAme /* = NULL */ , //用来定义事件对象的名称 LPSECURITY_ATTRIBUTES lpsaAttribute /* = NULL */ //指向一个LPSECURITY_ATTRIBUTES结构的指针 ) 也就是定义的对象为自动事件对象。初始状态为未发信状态,可以用SetEvent使之变为发信状态,等待线程中的第一个线程恢复运行,但事件对象会随即自动将其变为未发信状态,从而使其他处于等待状态的线程仍然被阻塞。 实现功能 1.新建基于对话框的应用程序 2.拖拽一编辑框ID为IDC_EDIT1,设置接收回车和多行属性,添加两按钮<正常执行两线程><使用事件对象实现两线程同步>关联函数 - void CGkbc8Dlg::OnNormal()
- {
- CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
- pEdit->SetWindowText("正常执行两线程:\r\n");
- AfxBeginThread(ThreadFun1,pEdit);
- AfxBeginThread(ThreadFun2,pEdit);
- }
- void CGkbc8Dlg::OnEvent()
- {
- CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
- pEdit->SetWindowText("使用事件对象实现两线程同步:\r\n");
- AfxBeginThread(ThreadFun3,pEdit);
- AfxBeginThread(ThreadFun4,pEdit);
- }
复制代码3.在此两按钮前面添加线程函数ThreadFun1, ThreadFun2,ThreadFun3, ThreadFun4及事件对象实现及对象所在头文件 - #include <afxmt.h>//CEvent头文件
- CEvent g_Event;//事件对象变量
- static UINT ThreadFun1(LPVOID pParam)
- {
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
复制代码- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="k";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n";
- pEdit->SetWindowText(sText);
- return 0;
- } static UINT ThreadFun2(LPVOID pParam)
- {
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="工";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n";
- pEdit->SetWindowText(sText);
- return 0;
- }
- static UINT ThreadFun3(LPVOID pParam)
- {
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="B";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
-
复制代码- pEdit->GetWindowText(sText);
- sText+="\r\n";
- pEdit->SetWindowText(sText);
- g_Event.SetEvent();//让线程4执行
- return 0;
- }
- static UINT ThreadFun4(LPVOID pParam)
- {
- g_Event.Lock();//挂起直到线程3触发
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="程";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n";
- pEdit->SetWindowText(sText);
- return 0;
- }
复制代码我们来演示下功能实现的整个过程 、
|