今天,我看到了这样一段代码:
void Foo()
{
MyMsgStruct myMsg;
/* omission for simplicity */
/* send to update thread */
PostThreadMessage(myThreadId, myMessage, (WPARAM)myMsg, NULL);
}
当从与 myThreadId
相同的线程调用 Foo()
时会发生什么,即 从应该是目标线程的相同线程调用?是性能问题还是只是糟糕的代码编写或两者兼而有之?
我相信它可能会影响性能,因为我相信它会将消息排队到线程的队列中,而不是仅仅做它应该做的事情,因此会稍微减慢程序速度。
线程安全不是我关心的问题对于这个问题。
最佳答案
没什么特别的,只是需要一段时间才能调用应该运行的代码。只是延迟,并不一定会使您的程序变慢。有时您是故意这样做的,例如想要响应 Windows 消息但立即响应会导致重新进入问题。
然而,几乎总是应该避免使用 PostThreadMessage。真正糟糕的事情发生在线程也创建窗口时,几乎总是这种情况,因为您倾向于发布到 UI 线程以获取代码,比如更新窗口。每当进入模态循环时,消息都会落入位桶中。就像用于调整窗口大小的那个。或者显示 MessageBox。始终倾向于发布到窗口,消息不会丢失。请检查 PostMessage() 的返回值。
创建一个虚拟的不可见窗口,其窗口过程处理这些消息通常是个好主意。您现在还有一种方法可以检查是否需要发布或可以直接使用 SendMessage 执行。比较 GetWindowThreadProcessId 和 GetCurrentThreadId。
关于c++ - 来自目标线程的 PostThreadMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931913/