替换Qt中的WaitForMultipleObjects

Val*_*itz 3 winapi qt porting

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

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

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

HANDLE  m_hEv[MAX_EV];
Run Code Online (Sandbox Code Playgroud)

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

WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*nek 6

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

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

  1. 而不是m_hEv,您将传递QWaitCondition*到代表事件的代码(最有可能通过WinAPI SetEvent(m_hEv[x]))
  2. 而不是WaitForMultipleObjects QWaitCondition::wait().
  3. 而不是SetEvent(),做QWaitCondition::wakeOne().

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

Qt同步障碍?