【问题标题】:Is DispatchMessage multithreaded?DispatchMessage 是多线程的吗?
【发布时间】:2017-11-15 15:57:44
【问题描述】:

我正在使用一个简单的循环来处理 windows 消息以呈现一个窗口:

while (GetMessage(&msg, NULL, 0, 0)>0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

虽然我在我的应用程序中只有一个线程,但在WM_PAINTWM_CHAR 部分中添加了一些OutputDebugString,我看到WM_PAINT 在我调用@ 的方法中间被调用987654326@,我看不出没有几个线程怎么可能。

所以我的问题很简单,这个循环是否使用多个线程来处理窗口消息?

谢谢

【问题讨论】:

  • 显示您的 WM_PAINTWM_CHAR 处理程序。回答您的问题在很大程度上取决于他们。
  • 这不是问题,这个循环只调度使用 PostMessage() 传递的消息。它总是将消息放在由创建窗口的同一线程拥有的队列中。您需要为 SendMessage() 而烦恼。直接调用一个窗口的窗口过程。只有系统消息(消息号小于 0x400)会自动编组到拥有窗口的线程。真正的问题肯定是重新进入,无论你做什么调用都会给消息循环一个发送消息的机会。不要对真正的电话保密。

标签: multithreading winapi


【解决方案1】:

不,DispatchMessage 不使用其他线程来执行其工作。您可以通过在日志输出中包含线程 ID 来自行检查。

您可能观察到的是一些重入行为。也许您调用了一个函数,该函数又调用了RedrawWindow,或类似的。该函数反过来调用您的窗口过程,导致您观察到的行为。

【讨论】:

  • 好的,它是 UpdateWindow,我不知道它立即完成了它的工作......谢谢
  • 是的,立即执行是它的 MO。文档说:该函数绕过应用程序队列,直接向指定窗口的窗口过程发送 WM_PAINT 消息。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多