c++ - 来自目标线程的 PostThreadMessage

标签 c++ windows multithreading

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

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/

相关文章:

c++ - "Cannot Open a.exe"C++ 错误

C++ 在构造函数中通过引用传递

c++ - 选择以 libxml2 结尾的行

ios - 快速异步加载多个 View

java - 使用 Twitter4j,我如何等待所有异步调用完成?

c++ - 在策略模式中使用带有自定义属性的 bgl dijkstra 代码

c++ - 具有关联值的枚举

windows - Git:查找大包文件中的最大文件

python - Python 有没有模拟键盘操作的库?

c++ - GCC 原子 shared_ptr 实现