实例学MFC(2)--线程间的通信之消息与事件

 

 

上次在实例学MFC(1)--线程 中我们讲了怎么样实现线程,顺水推舟,我们就顺便讲讲线程间的通信吧。

线程间的通信有很多方法:共享内存,Socket通信,信号量,事件和消息等。

今天我们主要通过消息和事件来实现。

VC6.0中根据向导,创建MFC项目(exe,对话框式)

这次我们在窗体中添加一个ListBox空间,ID为IDC_LIST1,在类向导中,为IDC_LIST1添加一个成员m_cList,Type是CListBox。

我们要实现一个什么功能呢?当我们点击OK按钮的时候,触发一个事件,在线程中监视这个事件,但受到事件的时候,发出一个消息,主线程收到这个消息的时候,在ListBox显示一条消息。(感觉像没事找抽型,直接点击一下按钮就显示一条消息不就行了么,何必大费周折。不过我们主要是想展示一下消息和事件的使用方法,大家就先咽下这口气吧)

 

#define  my_message (WM_USER + 100)   // 自定义消息
static  HANDLE myEvent     =  NULL;     // 定义一个事件
CWinThread *     m_pThread;                 //  线程的句柄

static   int  icount  =   0 ;                       // 用来显示的消息
static  CString msgToShow =   "" ;    // 用来显示的消息



UINT threadPro(LPVOID lParam)
{
    
while(TRUE)
    
{
        ::WaitForSingleObject(myEvent,INFINITE); 
//等待事件
        ::PostMessage((HWND)lParam,my_message,NULL,NULL);//发出自定义消息
        ::Sleep(1000);//休息1秒钟,也就是1秒钟内只响应一次,防止多动症的孩子一气乱点击
    }


    
return true;
}


封装映射消息

在头文件中:
//{{AFX_MSG(CEvent_exampleDlg)
。。。。
 afx_msg LONG ActionForMsg(UINT wParam, LONG lParam);  //加上这句
。。。。
 //}}AFX_MSG

在原文件中:
BEGIN_MESSAGE_MAP(CEvent_exampleDlg, CDialog)
 //{{AFX_MSG_MAP(CEvent_exampleDlg)
。。。
 ON_MESSAGE( my_message, ActionForMsg ) //添加这句
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

然后实现消息响应函数ActionForMsg

LONG CEvent_exampleDlg::ActionForMsg( UINT wParam, LONG lParam)
{
    m_cList.AddString(msgToShow);  //在ListBox中显示消息
    UpdateData();
    
return 0;
}

然后是双击OK按钮,编写OnOk函数

void  CEvent_exampleDlg::OnOK() 
{
    
// TODO: 
    SetEvent(myEvent);   //触发事件
    icount++;
    msgToShow.Format(
"%i",icount);   //我们要显示的文字

    
//CDialog::OnOK();//自动生成的,把它注释掉
}

在OnInitDialog(),做些初期化工作

// 生成事件
myEvent  =  ::CreateEvent(
    NULL,    
//  事件的属性,
    FALSE,     //  自动
    FALSE,     //  初始化,没有信号的
     " myevent "      //  对象名字
    );
// 创建和启动线程
m_pThread  =  ::AfxBeginThread(
    threadPro,    
//  
     this -> GetSafeHwnd()     //  传递窗体的句柄
    );

OK,编译实现。慢慢享受成果吧。怎么样,MFC比想象中简单吧

至于润色的工作,就麻烦大家自己参照实例学MFC(1)--线程 实现一下。

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页