Windows API PostThreadMessage进行线程间消息通信
2015-11-26 09:13
330 查看
相信好多人都听过这个Windows API:PostThreadMessage,今天终于有时间来详细的研究一下,据我所知好多的公司在面试的时候都会提到这个API,因为常写代码的人一定会知道这个API,通过这个提问,可以考察一个人对细节的掌握程度。不多说了,开始正题。
如下函数原型From MSDN:
BOOL WINAPI PostThreadMessage(_In_ DWORD idThread,_In_ UINT Msg,_In_ WPARAM wParam,_In_ LPARAM lParam);
idThread - [in] Type: DWORD The identifier of the thread to which the message is to be posted.
Msg - [in] Type: UINT The type of message to be posted.
wParam - [in] Type: WPARAM Additional message-specific information.
lParam - [in] Type: LPARAM Additional message-specific information.
也就是说为了使用这个API我们只要提供接受线程的线程ID以及相应的参数就行了,如下是代码实现,首先创建worker
thread 并且在worker thread中创建消息循环,这样当我们在主线程中PostThreadMessage的时候worker
thread就可以对进来的消息进行处理了,我们可以给worker thread发送TALK_MESSAGE,WM_QUIT
message, 一旦worker thread收到WM_QUIT
message, worker thread将报告给主线程自己要退出了,然后结束自己的生命周期。
DWORD ThreadProc(LPVOID lParam)
{
MSG msg;
while(GetMessage(&msg,0,0,0))
{
if(msg.message == TALK_MESSAGE)
{
MessageBox(NULL,L"Hi",L"Worker Thread",MB_OK);
}
DispatchMessage(&msg);
}
MessageBox(NULL,L"Thread will close by pressing OK",L"From Worker Thread",MB_OK);
AfxGetApp()->m_pMainWnd->PostMessageW(TALK_MESSAGE+1,0,0);
return 0;
}
void CPostThreadMSGDlg::OnBnClickedOk()
{
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,0,0,&m_dwThread);
::MessageBox(NULL,L"Worker Thread Created!",L"From main Thread",MB_OK);
OnOK();
}
void CPostThreadMSGDlg::OnBnClickedButtonHi()
{
PostThreadMessage(m_dwThread,TALK_MESSAGE,0,0);
}
void CPostThreadMSGDlg::OnBnClickedButtonCllose()
{
PostThreadMessage(m_dwThread,WM_QUIT,0,0);
}
LONG CPostThreadMSGDlg::OnWorkerThreadQuitFunction(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL,L"Main thread have known Worker Thread died!",L"From main Thread",MB_OK);
return 0;
}
如下函数原型From MSDN:
BOOL WINAPI PostThreadMessage(_In_ DWORD idThread,_In_ UINT Msg,_In_ WPARAM wParam,_In_ LPARAM lParam);
idThread - [in] Type: DWORD The identifier of the thread to which the message is to be posted.
Msg - [in] Type: UINT The type of message to be posted.
wParam - [in] Type: WPARAM Additional message-specific information.
lParam - [in] Type: LPARAM Additional message-specific information.
也就是说为了使用这个API我们只要提供接受线程的线程ID以及相应的参数就行了,如下是代码实现,首先创建worker
thread 并且在worker thread中创建消息循环,这样当我们在主线程中PostThreadMessage的时候worker
thread就可以对进来的消息进行处理了,我们可以给worker thread发送TALK_MESSAGE,WM_QUIT
message, 一旦worker thread收到WM_QUIT
message, worker thread将报告给主线程自己要退出了,然后结束自己的生命周期。
DWORD ThreadProc(LPVOID lParam)
{
MSG msg;
while(GetMessage(&msg,0,0,0))
{
if(msg.message == TALK_MESSAGE)
{
MessageBox(NULL,L"Hi",L"Worker Thread",MB_OK);
}
DispatchMessage(&msg);
}
MessageBox(NULL,L"Thread will close by pressing OK",L"From Worker Thread",MB_OK);
AfxGetApp()->m_pMainWnd->PostMessageW(TALK_MESSAGE+1,0,0);
return 0;
}
void CPostThreadMSGDlg::OnBnClickedOk()
{
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,0,0,&m_dwThread);
::MessageBox(NULL,L"Worker Thread Created!",L"From main Thread",MB_OK);
OnOK();
}
void CPostThreadMSGDlg::OnBnClickedButtonHi()
{
PostThreadMessage(m_dwThread,TALK_MESSAGE,0,0);
}
void CPostThreadMSGDlg::OnBnClickedButtonCllose()
{
PostThreadMessage(m_dwThread,WM_QUIT,0,0);
}
LONG CPostThreadMSGDlg::OnWorkerThreadQuitFunction(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL,L"Main thread have known Worker Thread died!",L"From main Thread",MB_OK);
return 0;
}
相关文章推荐
- Eclipse详细设置护眼背景色和字体颜色并导出
- mintty下启动emacs shell mode后,垃圾字符问题
- SQL语句的执行顺序
- HBuilder简介
- versions版本控制工具
- GPS项目\C++读取文本格式为UTF-8格式的文本文件
- LeetCode OJ 系列之121 Best Time to Buy and Sell Stock --Python
- [LeetCode286]Walls and Gates
- jQuery提示插件alertify使用指南
- AES加密算法(C++实现,附源码)
- php判断 !==false
- Android Manifest标签之activity
- Linux计算字符串md5/sha1
- 【snippet css】持续更新
- 2015 - 年终前端笔试题
- iOS数据本地化
- Android Manager更新失败 Failed to fetch URL http:xxxxxxxxxxxxxxxxxxxxxx(待解决)
- curl中post传参问题注解
- Mysql查看版本号的五种方式介绍
- Java 实现单例(Singleton)模式