首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Qt中替换WaitForMultipleObjects

在Qt中替换WaitForMultipleObjects
EN

Stack Overflow用户
提问于 2012-09-16 20:14:42
回答 2查看 3.4K关注 0票数 3

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

编辑:(按注释提供更多信息)

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

代码语言:javascript
复制
HANDLE  m_hEv[MAX_EV];

在线程的端点循环中,程序等待这样的事件:

代码语言:javascript
复制
WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )

HANDLE类型似乎是无效的。因此,我想知道,是否有任何Qt类能够观察到m_hEv中的更改和解锁线程执行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-17 09:24:15

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

最大的区别是WaitForMultipleObjects第三个参数,在您的情况下是FALSE。这意味着,只要等待数组的任何一个事件发生,它就会退出等待。这是比较简单的场景,可以用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 synchronization barrier?

票数 6
EN

Stack Overflow用户

发布于 2012-09-16 20:28:51

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12450362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档