• 线程间通信


    有三种方式:变量(即成员变量),消息(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 1941 Justice League
    HDU 1960 Taxi Cab Scheme
    POJ 1986 Distance Queries
    UVA 11991 Easy Problem from Rujia Liu?
    sql的跟踪与Tkprof工具
    ORA04031 错误
    Oracle_spatial的空间索引
    oracle发生重启动的介绍
    expdp\impdp及exp\imp
    oracle锁
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8406980.html
Copyright © 2020-2023  润新知