替换Qt中的WaitForMultipleObjects

时间:2012-09-16 20:14:42

标签: qt winapi porting

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

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

第三方API提供了一系列事件:

HANDLE  m_hEv[MAX_EV];

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

WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )

HANDLE类型似乎无效*。 所以我想知道,如果任何Qt类可以观察到m_hEv的更改并解锁线程执行。

2 个答案:

答案 0 :(得分:6)

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

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

  1. 而不是m_hEv,您会将QWaitCondition*传递给代表该事件的代码(最有可能通过WinAPI SetEvent(m_hEv[x])
  2. 执行QWaitCondition::wait()
  3. ,而不是WaitForMultipleObjects
  4. 而不是SetEvent(),请QWaitCondition::wakeOne()
  5. 第三个参数是 TRUE ,然后WinAPI代码等待,直到发出所有m_hEv事件的信号。此功能的既定名称是同步障碍,也可以使用QEventCondition进行模拟,但不会出现在Qt框中。我自己从不需要做任何事情,但是有一些想法如何去做:

    Qt synchronization barrier?

答案 1 :(得分:2)

WaitForMultipleObjects是一种泛型函数,可以处理许多事情:线程,进程,互斥体等.Qt是一个OOP库,每个类都公开它支持的操作。因此,Qt中的等效操作取决于您正在使用的类。例如,使用线程,使用QThread :: wait。使用互斥锁,使用QMutex :: lock。