我不熟悉WINAPI,我正在寻找一种方法来替换在一个示例中使用的WaitForMultipleObjects --我只使用Qt移植到Qt。有可能吗?
编辑:(按注释提供更多信息)
第三方API提供了一系列事件:
HANDLE m_hEv[MAX_EV];在线程的端点循环中,程序等待这样的事件:
WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )HANDLE类型似乎是无效的。因此,我想知道,是否有任何Qt类能够观察到m_hEv中的更改和解锁线程执行。
发布于 2012-09-17 09:24:15
在WaitForMultipleObjects之外移植WinAPI没有简单的方法。WinAPI有一个“优势”,即所有可锁定的资源(套接字、文件、进程)都提供相同的通用非类型HANDLE,即void*。与其他平台不同,根据资源类型有不同的锁定和信令方式,WinAPI中的事件处理在很大程度上独立于资源。然后就可以存在像WaitForMultipleObjects这样的泛型函数,它不需要关心是谁产生了句柄。因此,您必须了解代码正在尝试做什么,并在每个场景中以不同的方式模拟它。
最大的区别是WaitForMultipleObjects第三个参数,在您的情况下是FALSE。这意味着,只要等待数组的任何一个事件发生,它就会退出等待。这是比较简单的场景,可以用QWaitCondition替换。
m_hEv,您将把一个QWaitCondition*传递到发送事件信号的代码中(很可能是通过WinAPI SetEvent(m_hEv[x]))。QWaitCondition::wait()。SetEvent(),而是QWaitCondition::wakeOne()。如果第三个参数是TRUE,那么WinAPI代码将等待直到所有m_hEv事件都得到信号。这种功能的既定名称是同步屏障,它也可以用QEventCondition来模拟,但不会从Qt框中出来。我从来不需要自己做任何事,但我有一些想法:
发布于 2012-09-16 20:28:51
WaitForMultipleObjects是一种通用函数,它可以处理许多事情:线程、进程、互斥物等等。Qt是一个OOP库,每个类都公开它支持的操作。因此,Qt中的等效操作取决于您使用的是哪个类。例如,对于线程,使用QThread::wait。对于互斥对象,使用QMutex::lock。
https://stackoverflow.com/questions/12450362
复制相似问题