帖子:保证送达
PostMessage: Guaranteed to be delivered?
在我的C++应用程序中,我有一个后台线程可以执行一些工作,将结果放入堆分配的内存块中,并调用PostMessage将结果传递到主线程。
通常,当 Window 收到消息时,它会处理结果,然后在 lParam
指定的内存上执行delete
。
但我担心窗口可能会在处理消息和删除内存之前退出。
PostMessage
是否以某种方式保证目标窗口有机会处理消息?
如果没有,是否有任何众所周知的技术可以知道 Window 是否释放了内存,或者后台线程是否需要负责删除它?
PostMessage
肯定会被放入接收窗口的消息队列中。 但是,不能保证窗口会在那里。 到那时它可能已经被摧毁了。帮助确保消息到达那里的一种方法是创建自己的隐藏窗口(COM 通常使用此技术)并发布到其队列。 这样,您就可以控制隐藏窗口何时被破坏。 我们在实时数据传输中采用这种方法多年。
让后台线程删除内存是一个坏主意,可能会导致争用条件,即它不知道何时可以删除。 最好发布到您自己的窗口,并在完成后将其删除。
考虑 UI 线程的经典消息循环:
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
从其他线程发布的消息将被获取和调度,但其传递取决于目标窗口是否已成功创建(并且尚未销毁)。如果可以控制消息,则可以考虑直接在消息循环中处理消息。然而,当存在另一个(嵌套)消息循环时,事情可能会变得复杂,这可能是处理某些 Windows 消息的结果。一个简单的示例是模式对话框,但一些更复杂的内容(如 COM 标注)也可能导致嵌套消息循环。
因此,不应依赖有保证的消息传递。考虑使用全局数据结构(如队列或列表)(防止与关键部分同时访问)对数据对象进行排队。然后,您仍然可以使用 PostMessage
发布消息,并在 lParam
中传递指向数据对象的指针,但在消息处理程序中,您需要在全局队列中找到该对象并处理(或丢弃)之前排队的对象,但由于某种原因尚未处理。通常,当您的线程退出时(WM_QUIT
消息到达上面的循环中),您也应该对队列中剩余的内容进行一些处理。
- 发送一个带有libcurl C++问题的帖子请求:s
- HTTP帖子,无需等待响应
- 如何将对象从类线程传递到帖子?
- 可以提升 asio 帖子"overflow"队列
- Boost :: Asio HTTP帖子中的空身体
- 尝试使用帖子将数据添加到我的MySQL数据库中
- 用libcurl填写帖子表格并获取最终网址
- 我如何使用这些帖子消息Lparam和Wparam的?
- libcurl文件帖子在C 中,可用示例
- 如何使用POCO使用HTTP基本身份验证做HTTP帖子
- 使用Qt编辑VBulletin帖子
- 如何让libcurl在发送帖子信息之前进行回调
- 获取列名帖子
- 将带有 json 字符串的帖子发送到服务器
- 回复帖子请求
- 可以在 libcurl 中将多部分帖子字段作为数组发送
- 帖子:保证送达
- 第一个帖子!对头文件使用继承时出错
- 被所有关于向ec2linux添加新glib版本的帖子弄糊涂了
- Qt Web Service帖子查询