在 Visual Studio 2005 的 MFC 程序中的函数和消息机制涉及线程间通信、消息处理以及与窗口消息的交互。接下来我将详细分析以下每个函数的作用、如何使用它们以及它们之间的调用关系。
1. PostThreadMessage(m_iThOpID, MSG_OP_OVER, 0, (LPARAM)iLparm);
-
函数用途 :
PostThreadMessage
是一个用于向指定线程发送消息的函数。它允许一个线程将消息发送到另一个线程的消息队列。消息可以是自定义的,也可以是系统定义的消息。 -
参数分析:
m_iThOpID
:目标线程的标识符(线程ID)。该线程ID指示了消息将发送到哪个线程。MSG_OP_OVER
:消息的类型。这是一个自定义的消息标识符,表示某种操作完成的消息。通常这类消息会在程序中定义一个宏或枚举。0
:该参数是wParam
,它可以传递任何需要传递的附加数据。这里传递的是0
,意味着没有附加的参数。(LPARAM)iLparm
:lParam
是指向附加数据的指针或数据本身,这里使用的是iLparm
变量,这意味着传递一个整数值作为附加参数。
-
如何使用 : 该函数通常用于在多线程应用程序中发送线程间的通知。它将消息放入目标线程的消息队列,目标线程可以在合适的时机使用
GetMessage
或PeekMessage
等函数来获取和处理该消息。 -
典型应用场景 : 假设你有一个主线程和一个工作线程。工作线程完成某个任务后,可能会向主线程发送一个消息,通知主线程操作完成,这时可以使用
PostThreadMessage
发送类似MSG_OP_OVER
的消息。
2. PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
-
函数用途 :
PeekMessage
用于从消息队列中检索消息。如果消息队列中有消息,PeekMessage
会将消息提取出来并返回,但不会阻塞当前线程。如果没有消息,它会立即返回。 -
参数分析:
&msg
:指向MSG
结构体的指针,用于接收提取的消息内容。NULL
:指定窗口句柄。NULL
表示从当前线程的消息队列中获取消息。0, 0
:指定消息范围。0
表示接受所有类型的消息。PM_REMOVE
:表示在检索消息之后从队列中删除该消息。
-
如何使用 :
PeekMessage
通常用于消息循环中,当你不希望阻塞线程时使用。比如,在后台线程中可以调用PeekMessage
进行非阻塞的消息处理,检查并处理消息。 -
典型应用场景:
- 在主窗口的消息循环中,
PeekMessage
被用来检查并处理消息。如果没有消息需要处理,程序可以继续执行其他任务。 - 在多线程程序中,后台线程可以使用
PeekMessage
检查是否有来自主线程的消息,及时响应。
- 在主窗口的消息循环中,
3. m_pDlgFather->SendMessage(WM_TRANSPORT_AUTO, 1, atoi(str));
-
函数用途 :
SendMessage
用于发送消息到指定窗口(在这个例子中是一个对话框窗口)。这个函数会阻塞当前线程,直到目标窗口处理完该消息。 -
参数分析:
WM_TRANSPORT_AUTO
:这是一个自定义的消息标识符,表示某种与自动传输相关的操作。1
:这是wParam
,它是消息的附加数据,通常用于传递整数值。atoi(str)
:将字符串str
转换为整数并作为lParam
传递,lParam
用于传递额外的参数。
-
如何使用 :
SendMessage
用于发送消息到目标窗口,并等待该窗口处理完消息后返回结果。它适用于需要同步处理的场景。 -
典型应用场景 : 假设你的应用程序中有一个自动传输的操作,主窗口需要通知父窗口执行某个传输操作。这时,你可以使用
SendMessage
发送WM_TRANSPORT_AUTO
消息,并携带相关数据。
4. ON_MESSAGE(WM_TRANSPORT_AUTO, OnAutoTansportMessage)
-
函数用途 :
ON_MESSAGE
是 MFC 中的一个宏,它用于将特定消息与消息处理函数进行绑定。它的作用是将指定的消息映射到处理该消息的成员函数。 -
参数分析:
WM_TRANSPORT_AUTO
:这是消息标识符,表示该消息与自动传输操作相关。OnAutoTansportMessage
:这是消息处理函数的名称。当消息WM_TRANSPORT_AUTO
被发送到窗口时,OnAutoTansportMessage
函数会被调用。
-
如何使用 : 在 MFC 中,消息映射是通过在类中使用
ON_MESSAGE
宏来完成的。消息映射是将消息和相应的消息处理函数联系起来的机制。当收到指定的消息时,相应的函数会被调用并处理消息。 -
典型应用场景 : 当你在主窗口或者对话框窗口中收到
WM_TRANSPORT_AUTO
消息时,MFC 会自动调用OnAutoTansportMessage
函数来处理这个消息,进行自动传输相关的操作。
函数间的调用关系:
- 线程间通信 :
PostThreadMessage(m_iThOpID, MSG_OP_OVER, 0, (LPARAM)iLparm)
用于发送消息到另一个线程(如工作线程),通知它某个操作已经完成。
- 消息循环与消息处理 :
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)
允许当前线程检查是否有消息待处理。如果有,它会从队列中提取并处理消息。如果没有,它会继续执行其他操作。
- 父窗口消息处理 :
m_pDlgFather->SendMessage(WM_TRANSPORT_AUTO, 1, atoi(str))
将消息WM_TRANSPORT_AUTO
发送给父窗口或对话框,通知它进行自动传输操作。
- 消息映射与消息处理函数 :
ON_MESSAGE(WM_TRANSPORT_AUTO, OnAutoTansportMessage)
将WM_TRANSPORT_AUTO
消息与OnAutoTansportMessage
函数绑定。当消息到达时,OnAutoTansportMessage
会被调用并处理该消息。
总结:
PostThreadMessage
用于线程间的消息传递,通常用于一个线程通知另一个线程某个操作的完成。PeekMessage
用于在消息队列中检索消息,常用于非阻塞式的消息循环。SendMessage
用于发送消息到窗口,并等待窗口处理完消息后返回,通常用于同步操作。ON_MESSAGE
是 MFC 中的消息映射宏,将消息和对应的处理函数绑定起来。
这些函数和消息机制通常结合使用,尤其在多线程和消息驱动的应用程序中,确保各个线程之间能够有效地沟通并处理异步事件。