【问题标题】:Using observer pattern in the context of Qt signals/slots在 Qt 信号/槽的上下文中使用观察者模式
【发布时间】:2011-07-12 22:52:06
【问题描述】:

我正在尝试为我正在研究的算法做出一些设计决策。我想我想使用信号和槽来实现观察者模式,但我不确定一些事情。

这是我正在研究的算法:

1.) Load tiles of an image from a large file
1a.) Copy the entire file to a new location
2.) Process the tiles as they are loaded
3.) If the copy has been created, copy the resulting data into the new file

所以我设想有一个类,它具有像 loadAllTiles() 这样的函数,它会发出信号告诉 processTile() 另一个图块已准备好进行处理,同时继续加载下一个图块。

processTile() 将执行一些计算,完成后,向 writeResults() 发出信号,表明一组新的结果数据已准备好写入。 writeResults() 将验证复制是否完成,并开始写入输出数据。

这听起来合理吗?有没有办法让 loadAllTiles() 加载到一个图块中,以某种方式将该数据传递给 processTile() 然后继续加载下一个图块?我在考虑可能设置一个列表来存储准备处理的图块,以及准备写入磁盘的结果图块的另一个列表。我想缺点是我必须以某种方式保持这些列表完好无损,这样多个线程就不会尝试从列表中添加/删除项目。

感谢您的任何见解。

【问题讨论】:

    标签: c++ qt design-patterns


    【解决方案1】:

    您的问题并不完全清楚,但您似乎想将工作分成几个线程,以便在您完成加载整个集合之前开始处理图块。

    考虑一个多线程处理管道架构。为每个任务分配一个线程(加载、复制、处理),并通过Producer-Consumer 队列(又名 BlockingQueue)在任务之间传递图块。更准确地说,将指针(或共享指针)传递给磁贴以避免不必要的复制。

    Qt 中似乎没有现成的线程安全 BlockingQueue 类,但您可以使用 QQueueQWaitConditionQMutex 汇总自己的类。以下是一些灵感来源:

    虽然 Qt 中没有现成的 BlockingQueue,但使用带有 Qt::QueuedConnection 选项的信号和插槽似乎可以达到相同的目的。这个 Qt blog article 就是这样使用信号和槽的。

    您可能希望将此管道方法与 内存池空闲列表 切片组合,以便在您的管道中回收已分配的切片。

    这是管道的概念草图:

    TilePool -> TileLoader -> PCQ -> TileProcessor -> PCQ -> TileSaver -\
      ^                                                                 |
       \----------------------------------------------------------------/
    

    其中PCQ 表示生产者-消费者队列。

    要利用更多的并行性,您可以在每个阶段尝试thread pools

    您也可以考虑查看英特尔的Threading Building Blocks。我自己没试过。请注意开源版本的 GPL 许可。

    【讨论】:

      【解决方案2】:

      应该可以使用任何类型的并行化锁机制来防止列表损坏,无论是简单的锁、信号量等。

      否则,这种方法听起来很合理,尽管我会说文件必须才能使这有意义。只要它们很容易放入内存,我就看不到分段加载它们的意义。另外:您打算如何在不重复读取整个图像的情况下提取图块?

      【讨论】:

      • 是的,文件非常大 - 8GB+。
      • 我用来读取文件的 GDAL 库有一个共享的 I/O 例程,这将允许我基本上寻找文件中的不同位置以从我正在使用的格式中提取数据块
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多