我不熟悉WINAPI,我正在寻找一种方法来替换在一个例子中使用的WaitForMultipleObjects,我只使用Qt移植到Qt。有可能吗?
编辑:(根据评论中的要求提供更多信息)
第三方API提供了一系列事件:
HANDLE m_hEv[MAX_EV];
在线程的endles-loop中,程序等待这样的事件:
WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )
HANDLE
类型似乎无效*。
所以我想知道,如果任何Qt类可以观察到m_hEv的更改并解锁线程执行。
答案 0 :(得分:6)
在WinAPI之外没有简单的方法移植WaitForMultipleObjects
。 WinAPI具有“优势”,即所有可锁定资源(套接字,文件,进程)都提供相同的通用非类型安全HANDLE
,这是您的void*
。与根据资源类型具有不同锁定和信令方式的其他平台不同,WinAPI中的事件处理在很大程度上独立于资源。然后可以存在像WaitForMultipleObjects
这样的通用函数,它不需要关心是谁生成了HANDLE。因此,您必须了解代码尝试执行的操作,并在每个方案中以不同方式模拟它。
最大的区别在于WaitForMultipleObjects
第三个参数,在您的情况下为 FALSE 。这意味着只要等待数组的任何单个事件发生,它就会退出等待。这是更简单的方案,可以用QWaitCondition
替换。
m_hEv
,您会将QWaitCondition*
传递给代表该事件的代码(最有可能通过WinAPI SetEvent(m_hEv[x])
)QWaitCondition::wait()
。SetEvent()
,请QWaitCondition::wakeOne()
。第三个参数是 TRUE ,然后WinAPI代码等待,直到发出所有m_hEv事件的信号。此功能的既定名称是同步障碍,也可以使用QEventCondition
进行模拟,但不会出现在Qt框中。我自己从不需要做任何事情,但是有一些想法如何去做:
答案 1 :(得分:2)
WaitForMultipleObjects是一种泛型函数,可以处理许多事情:线程,进程,互斥体等.Qt是一个OOP库,每个类都公开它支持的操作。因此,Qt中的等效操作取决于您正在使用的类。例如,使用线程,使用QThread :: wait。使用互斥锁,使用QMutex :: lock。