Mfc WindProc为我做了什么?

Mfc WindProc为我做了什么?,mfc,postmessage,Mfc,Postmessage,我有一个多对话框的MFC客户端应用程序,我正在工作。该客户端可以接收大量发送到主对话框的消息(>10Hz),主对话框通常执行一些小功能,然后将该消息转发到另一个对话框进行处理。 在我的具体案例中,主对话框接收与车辆位置相关的消息,更新GUI上的几个字段,然后将其作为POST消息传递到显示所有车辆信息的窗口 因此,基本上,我的问题是:发布消息与仅仅调用dialog.update(这是我创建的一个函数)有什么区别 既然我们不知道你的dialog.update()是做什么的,那我们怎么知道有什么区别呢

我有一个多对话框的MFC客户端应用程序,我正在工作。该客户端可以接收大量发送到主对话框的消息(>10Hz),主对话框通常执行一些小功能,然后将该消息转发到另一个对话框进行处理。
在我的具体案例中,主对话框接收与车辆位置相关的消息,更新GUI上的几个字段,然后将其作为POST消息传递到显示所有车辆信息的窗口


因此,基本上,我的问题是:发布消息与仅仅调用dialog.update(这是我创建的一个函数)有什么区别

既然我们不知道你的dialog.update()是做什么的,那我们怎么知道有什么区别呢

如果你正在做另一个PostMessage,我不知道这是什么意思。您的程序必须等待消息循环的另一次迭代来检索您新发布的消息,并且在发布该消息之前可能会收到另一条消息。您可以使用SendMessage而不是PostMessage,它将消息直接发送到WndProc,而不必为另一条消息迭代消息循环


我认为,如果您是多线程的,那么发送或发布消息将更加线程安全,因为Windows应该自动切换上下文。如果您是单线程的,那么这可能不重要。

我相信您的应用程序是多线程的,其中一个线程正在接收数据,与GUI线程不同。您应该仅从其他线程使用
PostMessage
,而不是
SendMessage
或直接调用

如果您接收到的消息太多,您应该对它们进行缓冲—或者按计数(比如5000)或者按某个超时进行缓冲。您可以将信息保存在
vector
list
或您喜欢的任何其他集合中。稍后,在发送时,将此集合的地址作为
WPARAM
(或
LPARAM
)发布到对话框中。Dialog将得到它,在单个束中,并将处理它。这种方法可能不正确,因为我不知道您的应用程序的其他设计人员


您需要采用反复试验的方法,看看从何处获得实际的性能和稳定性优势。

是的,程序是多线程的。假设第二个windproc调用的函数与dialog.update()调用的函数相同。有人告诉我,Post消息会将其发送出去,并且不会等待更新完成,但是如果我执行dialog.update(),则在更新完成之前,我的代码不会继续。是这样吗?是的,基本上是这样。PostMessge所做的就是将一条消息放入拥有该窗口的线程的消息队列中,然后返回。拥有该窗口的线程随后必须泵送消息,直到它到达您发布到它的消息。但是,如果执行SendMessage,则消息将立即转到窗口的WndProc,并且在处理消息之前不会返回。因此,在3个选项中:1)发布消息、2)发送消息和3)对话框.update(),这就是我所拥有的:1)将立即发布并返回。消息的接收者将着手处理消息2)将立即发布,但在返回之前等待接收者完成。3) 和2号一样。我读对了吗?是的,但在“2”中,我会用“发送”而不是“发布”。如果您的窗口处于不同的线程中,那么选项2可能比选项3更好。