c++ - 什么 C++ 相当于 winapi 的 MsgWaitForMultipleObjectsEx
问题描述
我正在从使用本机 Win32 API 调用来管理线程的消息队列过渡到使用我自己的 C++ 代码。我遇到了一个我无法完全回答的问题。
给定以下代码片段
LRESULT QueueConsumeThread()
{
MSG msg = { 0 };
HANDLE hHandles[] = { hHandle1, hHandle2 };
while (true)
{
DWORD dwRes;
switch (dwRes = ::MsgWaitForMultipleObjects(_countof(hHandles), hHandles, FALSE, INFINITE, QS_ALLEVENTS))
{
case WAIT_OBJECT_0 :
DoSomething();
break;
case WAIT_OBJECT_0 + 1:
DoSomething2();
break;
case WAIT_OBJECT_0 + _countof(hHandles):
ATLASSERT(msg.message == WM_QUIT);
return 1;
}
}
return 1;
}
我在许多资料中都读到,一个特定的线程应该与一个关联condition_variable
,而且使用多个condition_variable
s 或调用wait_for()
或wait_until()
听起来效率不高。
以下来源建议实施safe_queue
using condition_variable
s。我猜这PeekMessage
/GetMessage/MsgWaitForMultipleObject
工作类似,但是队列的每个单元应该持有什么样的数据并能够接收事件信号?
编辑:我问这个是因为我必须编写一个跨平台的应用程序。
解决方案
与窗口同步事件(可以处于signalled
状态)相反,它与状态std::condition_variable
解耦。因此,最自然的方法是定义几个条件并使用单个等待/报告它们condition_variable
:
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{ return ready1 || ready2 || ready3; });
if (ready1) { ... }
if (ready2) { ... }
if (ready3) { ... }
std::unique_lock<std::mutex> lock(m);
ready1 = true;
cv.notify_one();
推荐阅读
- python - 在Python中将值列表拆分为数据框
- tensorflow - 如何使用 TF 2.0 tf.recompute_grad?
- javascript - Android Javascript接口函数在ajax回调中不起作用
- android - 如何获取 okhttp 存储的缓存大小为字节?
- python-3.x - 如何使用其他交替列表中的元素创建列表?
- asp.net - 过滤asp时击键之间的时间限制:DropDownList
- haskell - 将我的 Parser 类型描述为一系列 monad 转换器
- django - 当我运行 collectatic 以使用 django 将静态保存在 S3 存储桶中时出现 TypeError
- android - 如何获取json对象的名称并在登录android时打印它
- python - PIL图像旋转和背景问题