您的位置:首页 > 其它

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

2008-03-27 15:34 387 查看
上次在实例学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)--线程 实现一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: