最近在一个项目中因为主线程阻塞,需要使用工作者线程进行消息传递,最后的解决方案如下:
头文件定义:
#define WM_PROCESS_MESSAGE WM_USER+100
DWORD m_ThreadID=0;
DWORD m_ThreadID2=0;
HANDLE m_hThread,m_hThread2;
***************************************
CPP文件
1.先在主线程中创建一个工作者线程 GetProcessMessage(LPVOID pParam)用于接收其他线程传过来的消息
和一个工作者线程 SendProcessMessage(LPVOID pParam)用于向工作者线程发送消息
接收消息工作者线程主体:
UINT GetProcessMessage(LPVOID pParam)
{
MSG msg;
while(1)
{
::GetMessage(&msg, NULL, 0, 0);
switch(msg.message)
{
case WM_PROCESS_MESSAGE: //截获WM_PROCESS_MESSAGE消息
dosomething;
break;
default:
break;
}
}
return 0;
}
发送消息工作者线程主体
UINT SendProcessMessage(LPVOID pParam)
{
while(1)
{
Sleep(5000); //隔5秒自动向接收消息的工作者线程发送消息
::PostThreadMessage((DWORD)pParam, WM_PROCESS_MESSAGE, 0, 0);
}
return 0;
}
在主线程中创建接收线程消息的工作者线程
m_hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetProcessMessage,NULL,0,&m_ThreadID);
if ((m_hThread == NULL))//无法创建从线程
{
MessageBox(L"从线程创建失败!");
exit(-1);
}
在主线程中创建发送消息的工作者线程
m_hThread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SendProcessMessage,
(LPVOID)m_ThreadID,0,&m_ThreadID2); //注意红色部分 的参数为接收消息线程的ID
if ((m_hThread2 == NULL))//无法创建从线程
{
MessageBox(L"从线程创建失败2!");
exit(-1);
}
将主线程阻塞
while(1)
{
}
至此一个模拟主线程阻塞,工作者线程之间用消息进行通讯的例子已经完成了