QQ登录

只需一步,快速开始

230上位机VC MFC使用事件对象使线程同步

[ 复制链接 ]

230上位机VC MFC使用事件对象使线程同步

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,设置接收回车和多行属性,添加两按钮<正常执行两线程><使用事件对象实现两线程同步>关联函数
  1. void CGkbc8Dlg::OnNormal()
  2. {
  3.         CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
  4.         pEdit->SetWindowText("正常执行两线程:\r\n");

  5.         AfxBeginThread(ThreadFun1,pEdit);
  6.         AfxBeginThread(ThreadFun2,pEdit);
  7. }
  8. void CGkbc8Dlg::OnEvent()
  9. {
  10.         CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
  11.         pEdit->SetWindowText("使用事件对象实现两线程同步:\r\n");

  12.         AfxBeginThread(ThreadFun3,pEdit);
  13.         AfxBeginThread(ThreadFun4,pEdit);
  14. }
复制代码
3.在此两按钮前面添加线程函数ThreadFun1, ThreadFun2,ThreadFun3, ThreadFun4及事件对象实现及对象所在头文件
  1. #include <afxmt.h>//CEvent头文件
  2. CEvent g_Event;//事件对象变量
  3. static UINT ThreadFun1(LPVOID pParam)
  4. {
  5.         CEdit*pEdit=(CEdit*)pParam;
  6.         CString sText;
复制代码
  1. for(int i=0;i<25;i++)
  2.         {
  3.                 pEdit->GetWindowText(sText);
  4.                 sText+="k";
  5.                 pEdit->SetWindowText(sText);
  6.                 Sleep(50);
  7.         }
  8.         pEdit->GetWindowText(sText);
  9.         sText+="\r\n";
  10.         pEdit->SetWindowText(sText);
  11.         return 0;
  12. } static UINT ThreadFun2(LPVOID pParam)
  13. {
  14.         CEdit*pEdit=(CEdit*)pParam;
  15.         CString sText;
  16.         for(int i=0;i<25;i++)
  17.         {
  18.                 pEdit->GetWindowText(sText);
  19.                 sText+="工";
  20.                 pEdit->SetWindowText(sText);
  21.                 Sleep(50);
  22.         }
  23.         pEdit->GetWindowText(sText);
  24.         sText+="\r\n";
  25.         pEdit->SetWindowText(sText);
  26.         return 0;
  27. }
  28. static UINT ThreadFun3(LPVOID pParam)
  29. {
  30.         CEdit*pEdit=(CEdit*)pParam;
  31.         CString sText;
  32.         for(int i=0;i<25;i++)
  33.         {
  34.                 pEdit->GetWindowText(sText);
  35.                 sText+="B";
  36.                 pEdit->SetWindowText(sText);
  37.                 Sleep(50);
  38.         }
  39.         
复制代码
  1. pEdit->GetWindowText(sText);
  2.         sText+="\r\n";
  3.         pEdit->SetWindowText(sText);

  4.         g_Event.SetEvent();//让线程4执行
  5.         return 0;
  6. }
  7. static UINT ThreadFun4(LPVOID pParam)
  8. {
  9.         g_Event.Lock();//挂起直到线程3触发

  10.         CEdit*pEdit=(CEdit*)pParam;
  11.         CString sText;
  12.         for(int i=0;i<25;i++)
  13.         {
  14.                 pEdit->GetWindowText(sText);
  15.                 sText+="程";
  16.                 pEdit->SetWindowText(sText);
  17.                 Sleep(50);
  18.         }
  19.         pEdit->GetWindowText(sText);
  20.         sText+="\r\n";
  21.         pEdit->SetWindowText(sText);

  22.         return 0;
  23. }
复制代码
我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:230.上位机VC MFC关闭指定进程及自身进程.zip 
文件大小:135.85 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索