zoukankan      html  css  js  c++  java
  • 线程间通信

    有三种方式:变量(即成员变量),消息(PostMessage()和SendMessage()的参数传递),事件(也适用于进程间通信)

    建立线程有三种方式:CreateThread() ,WindowsAPI   此方法的退出方式为ExitThread

             AfxBeginThread() ,MFC

                _beginthreadex() ,C++类中封装的函数 :由申请空间和CreateThread()两部分组成 , 释放则由ExitThread()和释放空间两部分组成

    用一个小程序来练习

    功能如下:Create为创建线程,Calc为计算结果,结果显示在下方的编辑框中

    1.初始化函数:

    CMy0202ThreadTalkingDlg::CMy0202ThreadTalkingDlg(CWnd* pParent /*=NULL*/)
        : CDialogEx(CMy0202ThreadTalkingDlg::IDD, pParent)
        , m_radio(1)
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        m_hThread = NULL;
        m_bFlagQuit = true;
        m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件(安全值,自动,初始化为无信号,事件名称)
    }

    2. Create按钮处理函数:C++中创建线程的函数一般用:m_hThread =(HANDLE)_beginthreadex(NULL,0,&ThreadProc,this,0,0);//参数与CreateThread相同

    3.线程的处理函数:

     unsigned _stdcall ThreadProc( void * lpvoid)
     {
          
         CMy0202ThreadTalkingDlg *pthis = (CMy0202ThreadTalkingDlg*)lpvoid;
         while(pthis->m_bFlagQuit)//线程退出时使用
         {
             //等事件
             if(WAIT_TIMEOUT== WaitForSingleObject(pthis->m_hEvent,100))
                 continue;//等不到信号则再继续等,即没有按Calc按钮(事件置为有信号,创建时没有信号)
    
             int nsum =0;    
             nsum = (1+pthis->m_nNum)*pthis->m_nNum/2;
            
             //将值显示到主线程中
             pthis->PostMessage(UM_MSG,nsum);
            
            // SendMessage
         }
         return 0;
     }

    4.Calcu按钮的处理函数:

    void CThreadPhoneDlg::OnBnClickedButton2()
    {
        m_bflag = true;
        UpdateData(TRUE);//TRUE:控件给变量,FALSE:变量给控件
        switch(m_radio)
        {
        case 0:
            num = 10;
            break;
        case 1:
            num = 100;
            break;
        case 2:
            num = 1000;
            break;
        default:
            break;
        }
        SetEvent(m_hEvent);//将事件置为有信号
    }

    5.对单选按钮,

    在资源视图中:格式->Tab键顺序,将按钮设置成顺序,将第一个Radio Button属性Grouop设为true,右键添加变量,类别为Value

    即声明变量,绑定ID和变量,UpdateDate()为两者之间相互赋值的函数,按第一个Radio Button则m_radio为0,第二个则为1,依此类推

     6.添加命令消息,1>定义信号  #define UM_MSG (WM_USER + 1)

            2>绑定    ON_MESSAGE(UM_MSG,&CMy0202ThreadTalkingDlg::OnMsg)

            3>声明并实现函数   

    LRESULT CThreadPhoneDlg::OnMsg(WPARAM w, LPARAM l)
    {
        CString str;
        str.Format(_T("%d") , w);
        m_edit.SetWindowText(str);
        return 0;
    }
  • 相关阅读:
    第一阶段冲刺10天 第六天
    第一阶段冲刺10天 第五天
    第一阶段冲刺10天 第四天
    第一阶段冲刺10天 第三天
    第一阶段冲刺10天 第二天
    第一阶段冲刺10天 第一天
    典型用户分析
    第二次小组冲刺训练
    寻找水王代码(找多个字母中出现最多次数的字母)
    冲刺周期第二天
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8406980.html
Copyright © 2011-2022 走看看