3

我不熟悉 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 的变化并解锁线程执行。

4

2 回答 2

6

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

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

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

第三个参数是否为TRUE,然后 WinAPI 代码将等待,直到所有 m_hEv 事件都发出信号。这种功能的既定名称是同步屏障,它也可以模拟QEventCondition,但不是从 Qt 盒子里出来的。我从来不需要自己做任何事情,但是 SO 有一些想法:

Qt同步屏障?

于 2012-09-17T09:24:15.027 回答
2

WaitForMultipleObjects 是一种通用函数,适用于许多事物:线程、进程、互斥体等。Qt 是一个 OOP 库,其中每个类都公开了它支持的操作。因此,Qt 中的等效操作取决于您使用的类。例如,对于线程,使用 QThread::wait。对于互斥体,使用 QMutex::lock。

于 2012-09-16T20:28:51.630 回答