来自目标线程的PostThreadMessage

时间:2013-07-29 18:52:12

标签: c++ windows multithreading

今天,我见过像这样的代码:

void Foo()
{
    MyMsgStruct myMsg;

    /* omission for simplicity */

    /* send to update thread */
    PostThreadMessage(myThreadId, myMessage, (WPARAM)myMsg, NULL);
}

从与Foo()相同的线程调用myThreadId时会发生什么,即来自应该是目标线程的同一线程?是性能问题还是只是糟糕的编写代码或两者兼而有之?

我相信它可能会影响性能,因为我相信它会将消息排队到线程的队列而不是仅仅做它应该做的事情,因此减慢程序的速度。

线程安全不是我关心这个问题

2 个答案:

答案 0 :(得分:6)

没有什么特别的,只需要一段时间就可以调用任何应该运行的代码。只是延迟,它不一定会让你的程序变慢。有时你是故意这样做的,比如想要回复Windows消息,但是马上做这件事会导致重新入侵问题。

然而,几乎总是应该避免使用PostThreadMessage。真的很糟糕的事情发生在线程也创建窗口时,几乎总是如此,因为你倾向于发布到UI线程以获取代码,比如更新窗口。只要输入模态循环,消息就会落入位桶中。就像用于调整窗口大小的那个一样。或者显示MessageBox。总是喜欢张贴到窗口,消息不会丢失。检查PostMessage()的返回值。

创建一个虚拟的不可见窗口,其窗口过程处理这些消息通常是一个好主意。您现在还可以检查是否需要发布或可以直接使用SendMessage执行。将GetWindowThreadProcessId与GetCurrentThreadId进行比较。

答案 1 :(得分:2)

无论哪个线程正在调用PostThreadMessage(),消息都会进入目标线程ID的消息队列。线程将消息发布到自身是完全有效的。当线程将其消息队列泵入新消息时,将处理该消息。有时一个线程可能真的想要有一个延迟的动作,所以发布的消息对此有好处。如果一个线程想要立即执行某些操作,则调用PostThreadMessage()没有意义,只需直接执行操作即可。线程消息没有等效SendMessage()