【问题标题】:What does WindProc do for me?WindProc 能为我做什么?
【发布时间】:2012-07-17 12:56:05
【问题描述】:

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

所以基本上,我的问题是:发布消息或只是调用 dialog.update(这是我创建的函数)有什么区别?

【问题讨论】:

    标签: mfc postmessage


    【解决方案1】:

    好吧,既然我们不知道你的 dialog.update() 做了什么,我们怎么知道有什么区别呢?

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

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

    【讨论】:

    • 是的,程序是多线程的。假设第二个 windproc 调用了与 dialog.update() 相同的函数。有人告诉我 Post Message 将其发送出去并且不等待更新完成,但是如果我执行 dialog.update(),那么我的代码将在更新完成之前不会继续。是这样吗?
    • 是的,基本上。 PostMessge 所做的只是将消息放入拥有窗口的线程的消息队列中,然后返回。拥有该窗口的线程必须随后泵送消息,直到它到达您发布给它的消息。但是,如果您执行 SendMessage,则消息将立即转到窗口的 WndProc,并且在消息处理之前不会返回。
    • 所以在 3 个选项中:1) 发布消息,2) 发送消息和 3) Dialog.update(),这就是我所拥有的:1) 将立即发布并返回。消息的接收者将开始处理消息 2) 将立即发布,但在返回之前等待接收者完成。 3) 与否相同。 2. 我没看错吧?
    • 是的,但在“2)”中我会使用“发送”而不是“发布”这个词。如果您的窗口在不同的线程中,那么选项 2 可能比 3 更好。
    【解决方案2】:

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

    如果您收到的消息过多,您应该缓冲它们 - 通过计数(例如 5000)或超时。您可以将消息保存到vectorlist 或您喜欢的任何其他收藏中。稍后,在发送时,将这个集合的地址作为WPARAM(或LPARAM)发布到对话框中。 Dialog 会以一堆形式获取它并对其进行处理。这种方法可能不正确,因为我不了解您的应用程序的其他设计观点。

    您将需要试错法,看看您从哪里获得了实际的性能和稳定性优势。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2020-08-05
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多