c++ - PeekMessage 和 PostMessage 用法
问题描述
我有一个正在维护的遗留应用程序,它PostMessage(NULL,WM_CLOSE,0,0);
在某些地方调用。通过查看代码我无法猜测它是否连接到以下(在不同的线程中执行),
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if ( msg.message == WM_CLOSE)
{
return;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
早些时候,它使用一些 win32 事件来同步线程之间的访问。但是,现在我已经修改它以使用std::condition_variable
andstd::mutex
代替。我想知道这些是否PostMessage
与PeekMessage
这些事件有关。该应用程序还有一些PumpMessage
(上面引用的实现)和StopMessagePump
我从未使用过且不再有用的实现。该应用程序应该在后台运行,即它本身不拥有或处理任何控制台窗口。
我阅读了MSDN上的文档,发现很难理解,因为它们在内部将 PostThreadMessage 称为特例。
但是,总的来说,有什么PostMessage(NULL,WM_CLOSE,0,0)
能力?
解决方案
正如记录的那样,带有 NULL 的PostMessagePostThreadMessage
的行为类似于. 但总是针对当前的三个广告。在您的情况下,如果只有一个线程,就像设置一个标志一样。甚至没有发生多线程。不需要互斥体或其他特殊对象。
如果存在多线程,并且根本没有窗口,并且您不需要在此类窗口之间使用 aPostMessage
和消息循环进行任何同步,则可以使用std::condition_variable
or std::mutex
。
而不是PostMessage
使用notify_one
or notify_all
。而不是消息循环使用wait_for
. (相应的互斥锁)
但请注意,如果您有 COM STA 或类似设备,您仍然需要消息循环。您仍然可以使用std::condition_variable
or std::mutex
,但您应该只在您创建的所有对象都被销毁并且满足您的条件后才停止消息循环!
推荐阅读
- c - 条件数据观察点在 ARM GDB 中不起作用
- ios - 在继续下一个代码iOS swift之前等待响应结果
- c# - 实体框架核心从父子集合中获取单个子
- python - 如何在井字游戏中使用带有 minimax 算法的记忆化?
- sql - SQL 分层数据
- shell - “/usr/bin/npm”和“/usr/local/bin/npm”的区别链接
- node.js - 如何允许客户在服务网站上为自己的页面设置自定义域?
- java - Java - 将对象列表转换为地图数据结构的地图
- android - 为Android开发插件时找不到Flutter
- terraform - 带有 terraform 和 helm 的外部部署配置