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;
    }
  • 相关阅读:
    HDU 1863 畅通工程(Kruskal)
    HDU 1879 继续畅通工程(Kruskra)
    HDU 1102 Constructing Roads(Kruskal)
    POJ 3150 Cellular Automaton(矩阵快速幂)
    POJ 3070 Fibonacci(矩阵快速幂)
    ZOJ 1648 Circuit Board(计算几何)
    ZOJ 3498 Javabeans
    ZOJ 3490 String Successor(模拟)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8406980.html
Copyright © 2011-2022 走看看