【问题标题】:Qt and RTI DDS interaction---Need some guidanceQt和RTI DDS交互---需要一些指导
【发布时间】:2013-07-24 12:56:40
【问题描述】:

我正在制作一个 GUI,我在 QStackedWIdget 上有多个表单。现在我希望这些表格中的数据在可用时更新。数据将通过 RTI DDS 接收。有人可以建议我一些从非 GUI 线程更新 GUI 数据的示例或链接吗?

谢谢。

【问题讨论】:

    标签: qt data-distribution-service


    【解决方案1】:

    您有多种选择。根据您的问题,我将解释最适合您情况的那个。

    首先,您需要知道在订阅方方面,您的应用程序和 DDS 数据读取器之间可能存在三种不同类型的交互:轮询、侦听器和等待集。轮询基本上意味着您的应用程序在认为必要时查询 DataReader,例如以固定速率。使用侦听器意味着您的应用程序为中间件提供了一些回调函数,这些函数在新数据到达时被调用。等待集类似于套接字select,您的应用程序线程在数据到达或发生超时之前被阻塞 - 通常随后是访问 DataReader 的操作。

    对于 GUI 应用程序,通常使用轮询机制而不是您可能使用的侦听器方法。您可以让 GUI 以固定速率(例如 5 Hz)从 DataReader 读取或获取数据,而不是在数据到达时读取数据并立即更新 GUI 小部件。

    使用这种方法,您可以控制访问 DDS 的时间,并且无论数据在 DataReader 中的更新速度有多快,都可以按所需的准确速率进行。此外,您的数据由非 GUI 线程更新的问题已得到解决,因为您可以从自己的上下文中访问 DDS DataReader。

    使用轮询的一个潜在缺点可能是小部件的更新会发生一些延迟,例如,如果您以 5 Hz 的频率进行轮询,则最大额外延迟将为 200 毫秒。不过,这对于 GUI 应用程序来说通常不是问题。

    【讨论】:

    • 我们正在处理的一些数据需要实时处理。处理关键数据的延迟会影响我们的应用程序。所以请提出比轮询更好的解决方案。
    • 对于需要高响应性的数据,您可以使用等待集,其工作方式类似于套接字select。您的线程会阻塞,直到数据可用。当它解除阻塞时,您可以读取或获取数据。但是,这些数据的性质听起来不像典型的 GUI 数据。您确定要在 GUI 应用程序中进行这种实时处理吗?
    • 是的,它不是一个 GUI 应用程序。 GUI 仅用于显示我们将从现场接收的数据。将有一个用于 GUI 的线程来更新收到的数据。
    • 在这种情况下,您还可以考虑将其分为两个进程:一个进程显示数据(使用轮询),另一个进程实时处理数据(使用等待集或侦听器)。跨度>
    • Waitsets 和 listeners 具有相似的特征,正确的选择取决于数据的性质。通常,如果数据更受事件驱动(非周期性),则使用侦听器。对于定期(以高速率)更新的数据,等待集往往更合适,因为它们可以更好地将您的应用程序与数据总线上发生的事情分离。通常,您使用两者中的哪一个并没有太大区别。顺便说一下,由于您是新来的,请务必查看帮助部分,特别是关于 voting for and accepting answers
    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多