c++ - 在 Qt 信号/槽的上下文中使用观察者模式

标签 c++ qt design-patterns

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

这是我正在研究的算法:

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() 另一个图 block 已准备好进行处理,同时继续加载下一个图 block 。

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

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

感谢您的任何见解。

最佳答案

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

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

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

虽然 Qt 中没有现成的 BlockingQueue,但似乎将信号和槽与 Qt::QueuedConnection 一起使用选项可能有相同的目的。这个Qt blog article信号和槽就是这样使用的。

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

这是管道的概念草图:

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

其中 PCQ 代表一个生产者-消费者队列。

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

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

关于c++ - 在 Qt 信号/槽的上下文中使用观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672186/

相关文章:

c++ - BOOST_FOREACH 在模板中不起作用?

c++ - 科学记数法的类型

c++ - 指向 void 的指针变成智能指针

java - 改进验证检查的构建器模式?

c++ - 最简单的实现模式 1 writer - 多个 readers with boost library

c++ - 为什么我不能从自身内部调用类的启动函数?

c++ - 为什么可以连接到未声明为 Q_SLOTS 的函数?

dependency-injection - 依赖注入(inject)与工厂模式

multithreading - 如何中断 UI 线程

c++ - 确定哪个成员在 namespace 中可见