1

我参与了构建一个自定义 QGIS 应用程序,其中实时数据将显示在应用程序的查看器上。

使用的 IPC 是 unix 消息队列。

数据将以指定的间隔刷新,例如 3 秒。

现在我面临的问题是要显示的数据的处理时间超过 3 秒,所以我所做的是在应用程序开始处理数据以进行下一次更新之前,刷新 QTimer 已停止处理完数据后,我再次重新启动 QTimer。应用程序应该以这样的方式工作,即在更新/刷新后(在此刷新期间应用程序无响应),用户应该有足够的时间继续在应用程序上工作,除了看到正在更新的数据。在一种情况下,我能够为用户工作获得可接受的暂停。

但是在不同的操作系统(RHEL 5.0 到 RHEL 5.2)上,情况有所不同。计时器变得狂野并继续触发,没有任何暂停 b/w 连续更新因此进入无限循环。处理此更新数据肯定需要更长的时间3 秒,但出于这个原因,我在处理时停止 - 重新启动了计时器。相同的逻辑在一种情况下有效,而在另一种情况下则没有。我观察到的另一个事实是,当快速触发计时器时发生刷新功能退出所花费的时间非常短,大​​约为 300 毫秒,因此我放置在此功能的开始和结束处的计时器的开始停止发生在那个小时间......所以在实际处理之前数据完成,队列中有 3-4 个计时器启动等待执行,因此对于每次连续更新,无限循环问题从那时起变得更糟。

这里要注意的重要一点是,对于一个操作系统中的相同代码,刷新时间显示为大约 4000 毫秒(相同数据量的实际处理时间),而对于另一个操作系统,刷新时间为 300 毫秒。

也许这与更新的操作系统上的较新库有关..但我不知道如何调试它,因为我无法得到任何线索为什么它会发生这种情况......也许与 pthreads 相关的东西已经改变了 b/w操作系统??

所以,我的问题是有什么方法可以确保我的应用程序中的某些处理是定时的(并且独立于操作系统)而不使用 QTimer,因为我认为 QTimer 不是实现我想要的好选择?

可以有什么选择??pthreads 或 Boost 线程?如果我要使用线程作为替代,哪一个会更好?但是无论更新处理需要多长时间,我如何确保至少有 3 秒的间隔 b/w 连续更新?

请帮忙。

谢谢。

4

1 回答 1

1

如果我试图获得一个可接受的长期解决方案,我会调查在单独的线程中更新您的显示。在该线程中,您可以将显示绘制到图像上,根据需要随时更新……尽管您可能希望限制线程,以免占用所有可用的处理时间。然后在 UI 线程中,您可以读取该图像并将其绘制到屏幕上。这可以提高您对平移的响应能力,因为您可以显示图像的不同部分。您可以根据计时器每 3 秒更新一次图像(只需从源重绘),或者您可以让另一个线程在新数据完全刷新时发出信号。

于 2009-09-09T20:01:50.327 回答