目录
1、PostThreadMessage的函数原型
2、PostThreadMessage一个简单的示例
3、实际应用中,会用 BEGIN_MESSAGE_MAP 宏定义消息映射表(MFC)
PostThreadMessage是一个Windows API函数,用于向指定线程的消息队列中发送一个消息。
BOOL PostThreadMessage(
DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
参数说明:
- idThread:要发送消息的目标线程的ID。
- Msg:要发送的消息类型。
- wParam:消息的附加参数。
- lParam:消息的附加参数。
PostThreadMessage函数将消息发送到指定线程的消息队列中,然后立即返回。线程可以通过调用GetMessage或PeekMessage函数来获取并处理该消息。该函数通常用于线程间的通信,可以用来传递自定义消息或系统消息,从而实现线程之间的协作和信息交换。
演示如何使用PostThreadMessage向另一个线程发送消息:
#include
#include
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
MSG msg;
HWND hWnd = (HWND)lpParam;
// 等待消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_USER)
{
std::cout << "Received custom message." << std::endl;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
int main()
{
// 创建一个新线程
DWORD threadId;
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &threadId);
if (hThread == NULL)
{
std::cout << "Failed to create thread." << std::endl;
return 1;
}
// 等待一段时间
Sleep(1000);
// 向线程发送消息
if (!PostThreadMessage(threadId, WM_USER, 0, 0))
{
std::cout << "Failed to post thread message." << std::endl;
return 1;
}
// 等待线程结束
WaitForSingleObject(hThread, INFINITE);
// 关闭线程句柄
CloseHandle(hThread);
return 0;
}
在上述示例中,我们创建了一个新的线程,并通过CreateThread函数启动。然后,我们使用PostThreadMessage函数向该线程发送一个自定义消息(WM_USER)。在线程的消息循环中,我们通过GetMessage函数获取消息并进行处理。在本例中,我们判断接收到的消息是否为自定义消息WM_USER,并进行相应的处理。然后,我们等待线程结束并关闭线程句柄。
请注意,上述示例中的线程函数ThreadProc是一个简单的消息循环,用于处理线程收到的消息。在实际应用中,您可能需要根据需要自定义消息处理过程。
将自定义消息和处理函数一一对应起来
(1)先了解下BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP 是一个宏定义,用于在 MFC(Microsoft Foundation Classes)中定义消息映射表。MFC 是微软提供的一套用于开发 Windows 应用程序的类库,它封装了许多常用的 Windows API 函数和功能,简化了 Windows 应用程序的开发过程。
在 MFC 中,消息映射是一种机制,用于将窗口消息(如鼠标点击、键盘输入等)与对应的处理函数关联起来。通过使用 BEGIN_MESSAGE_MAP 宏定义,可以在类的声明中定义一个消息映射表,将消息与处理函数进行关联。
消息映射表由一系列的消息映射宏组成,每个消息映射宏都指定了一个消息 ID 和对应的处理函数。当窗口接收到相应的消息时,MFC 会自动调用对应的处理函数进行处理。
(2)以下是一个示例代码片段,展示了如何使用 BEGIN_MESSAGE_MAP 宏定义消息映射表:
"afx_msg" 是一个宏定义,用于在 MFC 框架中声明一个成员函数。它是用于处理消息的函数的前缀,用于将成员函数与消息映射起来。在 MFC 中,消息是通过 Windows 消息机制传递的,而 "afx_msg" 宏则用于指定成员函数是用于处理特定消息的。
class CThreadDevice: public CThreadBase
{
public:
// ...
protected:
//执行下发数据功能操作
afx_msg void OnMsgIssueData(WPARAM wParam,LPARAM lParam);
//执行启动获取数据的操作
afx_msg void OnMsgStartGetData(WPARAM wParam,LPARAM lParam);
//执行停止获取数据的操作
afx_msg void OnMsgStopGetData(WPARAM wParam,LPARAM lParam);
//接收到硬件推送的消息,进行数据获取
afx_msg void OnMsgGetData(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CThreadDevice, CThreadBase)
ON_THREAD_MESSAGE(WM_THREAD_NFC_ISSUE_DATA, OnMsgIssueData)
ON_THREAD_MESSAGE(WM_THREAD_DEVICE_START_GET_DATA, OnMsgStartGetData)
ON_THREAD_MESSAGE(WM_THREAD_DEVICE_STOP_GET_DATA, OnMsgStopGetData)
ON_THREAD_MESSAGE(WM_THREAD_DEVICE_NOTIFY, OnMsgGetData)
END_MESSAGE_MAP()
通过 DECLARE_MESSAGE_MAP 宏将消息映射表声明为类的一部分,并使用 BEGIN_MESSAGE_MAP 宏开始定义消息映射表,然后使用 ON_THREAD_MESSAGE 宏将消息 ID 和对应的处理函数进行关联,最后使用 END_MESSAGE_MAP 宏结束消息映射表的定义。
ON_THREAD_MESSAGE是一个事件类型,表示当在一个线程中收到消息时触发的事件。
(3)在需要执行该函数功能的时候,发出请求
// 声明一个变量
CThreadDevice* m_pThreadDevice;
// 发出请求
m_pThreadDevice->PostThreadMessage(WM_THREAD_NFC_ISSUE_DATA, (WPARAM)wParam, (LPARAM)0);
该线程收到这个自定义消息时候,就会执行映射表里对应的函数OnMsgIssueData。