1

今天,我看到了这样的代码:

void Foo()
{
    MyMsgStruct myMsg;

    /* omission for simplicity */

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

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

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

线程安全不是我对这个问题的关注。

4

2 回答 2

7

没什么特别的,只是需要一段时间才能调用任何应该运行的代码。只是延迟,并不一定会使您的程序变慢。有时您是故意这样做的,例如想要响应 Windows 消息但立即这样做会导致重入问题。

然而,几乎总是应该避免使用 PostThreadMessage。当线程也创建窗口时会发生非常糟糕的事情,几乎总是这样,因为您倾向于发布到 UI 线程以获取代码以更新窗口。每当进入模态循环时,消息就会落入比特桶中。就像用于调整窗口大小的那个。或显示 MessageBox。总是倾向于张贴到一个窗口,而不是,消息不会丢失。请检查 PostMessage() 的返回值。

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

于 2013-07-29T19:00:40.690 回答
3

消息进入目标线程 ID 的消息队列,无论调用哪个线程PostThreadMessage()。线程向自己发布消息是完全有效的。当线程将其消息队列泵入新消息时,将处理该消息。有时一个线程可能真的希望有一个延迟的动作,所以发布的消息是有好处的。如果一个线程想立即做某事,调用没有意义PostThreadMessage(),直接执行操作即可。没有等效SendMessage()于线程消息。

于 2013-07-29T18:57:46.607 回答