QGIS(Quantum GIS)中的QTimer触发问题

QGIS(Quantum GIS)中的QTimer触发问题,qt,multithreading,timer,qgis,Qt,Multithreading,Timer,Qgis,我曾参与构建一个custum QGIS应用程序,其中实时数据将显示在应用程序的查看器上 正在使用的IPC是unix消息队列 数据将以指定的间隔刷新,例如3秒 现在我面临的问题是,要显示的数据的处理时间超过了3秒,所以我所做的是在应用程序开始为下一次更新处理数据之前,刷新QTimer已停止,在处理数据后,我再次重新启动QTimer。应用程序的工作方式应确保在更新/刷新后(在此刷新期间,应用程序无响应)除了看到数据被更新之外,用户应该有足够的时间继续使用该应用程序。在一个场景中,我能够让用户获得可接

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

正在使用的IPC是unix消息队列

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

现在我面临的问题是,要显示的数据的处理时间超过了3秒,所以我所做的是在应用程序开始为下一次更新处理数据之前,刷新QTimer已停止,在处理数据后,我再次重新启动QTimer。应用程序的工作方式应确保在更新/刷新后(在此刷新期间,应用程序无响应)除了看到数据被更新之外,用户应该有足够的时间继续使用该应用程序。在一个场景中,我能够让用户获得可接受的暂停

但在不同的操作系统(RHEL 5.0到RHEL 5.2)上,情况有所不同。计时器会失控并继续启动,不会出现任何暂停,随后的更新会进入无限循环。处理此更新数据肯定需要3秒以上的时间,但正是由于这个原因,我在处理时停止了重新启动计时器。同样的逻辑在一种情况下有效,而在另一种情况下则无效。。我观察到的另一个事实是,当计时器快速启动时,刷新功能退出所用的时间非常短,大约为300ms,因此我在该功能开始和结束时放置的计时器的开始-停止发生在很短的时间内。因此,在数据的实际处理完成之前,队列中有3-4次计时器启动等待执行,因此每次连续更新都会导致无限循环问题恶化

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

也许这与更新操作系统上更新的LIB有关…但是我不知道如何调试它,因为我无法得到任何线索,为什么它会这样发生。。。也许与pthreads相关的东西改变了OSs

因此,我的问题是,有没有任何方法可以确保我的应用程序中的某些处理是时间化的(并且与操作系统无关),而不使用QTimer,因为我认为QTimer不是实现我想要的东西的好选择

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

请帮忙


谢谢。

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

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

我认为的另一个缺陷是计时器的stop-start命令位于该QTimer本身触发所导致的执行代码中,即,当下一个执行周期的stop-start语句被执行时,QTimer被激活在执行过程中的这个周期内处于活动状态,有没有由此产生的不良影响,有没有建议?实际上,调用此刷新功能不仅是因为计时器被触发,而且是因为在缩放/平移查看器时,所以我必须在用户缩放/平移时停止数据处理,以保持应用程序的响应性,当然,为了避免Segfaults,我认为另一个缺陷是计时器的stop-start命令位于该QTimer本身触发导致的执行代码内,即当下一个执行周期的stop-start语句被执行时,该QTimer在执行的周期内处于活动状态,由此产生的任何不良影响,有什么建议吗?实际上,调用此刷新功能不仅是因为计时器被触发,而且是在缩放/平移查看器时调用的,因此我必须在用户缩放/平移时停止数据处理,以保持应用程序的响应性,当然也是为了避免出现故障……或者更确切地说,您是否在其他线程中工作-UI必须在主线程中更新。否则,这就是出路。听起来你所做的事情在计算上很昂贵——除非你能优化整个负载,否则你的UI会冻结,除非你把它放在一个单独的线程上……或者更确切地说,你在另一个线程中工作——UI必须在主线程中更新。否则,这就是出路。听起来你所做的事情在计算上很昂贵——除非你能优化整个负载,否则你的UI就会冻结,除非你把它放在一个单独的线程上。