gpt4 book ai didi

qt - 在 Qt 中替换 WaitForMultipleObjects

转载 作者:行者123 更新时间:2023-12-04 13:27:24 26 4
gpt4 key购买 nike

我不熟悉 WINAPI,我正在寻找一种方法来替换在一个示例中使用的 WaitForMultipleObjects,我只使用 Qt 将其移植到 Qt。有可能吗?

编辑:(根据评论要求提供更多信息)

第 3 方 API 提供一系列事件:

HANDLE  m_hEv[MAX_EV];

在一个线程的 endles-loop 中,程序等待这样的事件:

WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )

HANDLE 类型似乎是 void*。所以我想知道,是否有任何 Qt 类可以观察 m_hEv 的变化并解锁线程执行。

最佳答案

没有将 WaitForMultipleObjects 移植到 WinAPI 之外的简单方法。 WinAPI 有一个“优势”,即所有可锁定资源(套接字、文件、进程)都提供相同的通用非类型安全 HANDLE,即您的 void*。与根据资源类型具有不同锁定和信号方式的其他平台不同,WinAPI 中的事件处理在很大程度上独立于资源。然后可以存在像 WaitForMultipleObjects 这样的通用函数,它不需要关心是谁产生了 HANDLE。因此,您必须了解代码试图做什么,并根据场景以不同的方式模仿它。

最大的区别在于 WaitForMultipleObjects 第三个参数,在您的情况下为 FALSE。这意味着一旦等待数组的任何单个事件发生,它就会退出等待。这是更简单的场景,可以用 QWaitCondition 替换。

  1. 您将传递 QWaitCondition* 而不是 m_hEv 到发出事件信号的代码中(很可能通过 WinAPI SetEvent(m_hEv[x]))
  2. QWaitCondition::wait()代替WaitForMultipleObjects。
  3. QWaitCondition::wakeOne() 代替 SetEvent()

如果第三个参数为 TRUE,那么 WinAPI 代码会一直等待,直到所有 m_hEv 事件都发出信号。此类功能的既定名称是同步屏障,它也可以用QEventCondition 进行模拟,但不是从Qt 框架中出来的。我从来不需要自己做任何事情,但是 SO 有一些想法:

Qt synchronization barrier?

关于qt - 在 Qt 中替换 WaitForMultipleObjects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12450362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com