线程间通信

Posted Lune-Qiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程间通信相关的知识,希望对你有一定的参考价值。

有三种方式:变量(即成员变量),消息(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;
}

 

以上是关于线程间通信的主要内容,如果未能解决你的问题,请参考以下文章

多线程-线程间的通信

多线程-线程间的通信

多线程_线程间通信

c++ 线程间通信方式

多线程---线程间的通信

线程间的通信 与 线程池