实例学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)--线程 实现一下。
线程间的通信有很多方法:共享内存,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)--线程 实现一下。
相关文章推荐
- MFC创建线程,消息通信修改
- 多线程通信实例(子线程向主线程:用委托事件实现)
- c++控制台(非窗口,非MFC框架)里线程如何通过自定义消息通信
- 自定义消息实现线程间通信
- java 多线程-线程通信实例讲解
- 学习MFC的消息通信问题
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- MFC 判断是否从控件本身触发的事件消息
- No MFC 编程05 - 进程 > 线程 > 消息队列,三者的包含关系
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- MFC消息三部曲(3)——多窗口之间的通信
- mfc事件消息
- MFC串口调试助手线程监听事件小解
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 主线程与用户界面线程(含有消息泵的线程)的通信
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- MFC线程(三):线程同步事件(event)与互斥(mutex)
- 使用MFC 发送消息模拟按钮按下事件
- 使用MFC 发送消息模拟按钮按下事件