我正在制作一个 GUI,其中 QStackedWIdget 上有多个表单。现在我希望这些表格中的数据在可用时进行更新。数据将通过 RTI DDS 接收。有人可以建议我一些示例或链接,其中 GUI 数据是从非 GUI 线程更新的吗?
谢谢。
最佳答案
您有多种选择可供选择。我将根据您的问题进行评估,解释最适合您情况的一种。
首先您需要知道,在订阅者端,您的应用程序和 DDS DataReaders 之间可能存在三种不同类型的交互:轮询、监听器和等待集。轮询基本上意味着您的应用程序在认为必要时(例如以固定速率)查询 DataReader。使用监听器意味着您的应用程序为中间件提供一些回调函数,每当新数据到达时就会调用这些回调函数。等待集类似于套接字select
,其中应用程序线程将被阻塞,直到数据到达或发生超时 - 通常随后执行访问 DataReader 的操作。
对于 GUI 应用程序,通常使用轮询机制,而不是您可能正在使用的监听器方法。您可以让 GUI 以固定速率(例如 5 Hz)从 DataReader 读取或获取数据,而不是在数据到达时读取数据并立即更新 GUI 小部件。
通过这种方法,您可以控制何时访问 DDS,并且可以按照所需的准确速率进行访问,无论 DataReader 内的数据更新速度有多快。此外,您的数据由非 GUI 线程更新的问题也得到了解决,因为您可以从自己的上下文访问 DDS DataReader。
使用轮询的一个潜在缺点可能是小部件的更新会出现一些延迟,例如,如果您以 5 Hz 进行轮询,则最大额外延迟将为 200 毫秒。不过,这对于 GUI 应用程序来说通常不是问题。
关于Qt 和 RTI DDS 交互---需要一些指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834696/