我正在尝试为我正在研究的算法做出一些设计决策。我想我想使用信号和槽来实现观察者模式,但我不确定一些事情。
这是我正在研究的算法:
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 类,但您可以使用 QQueue
、QWaitCondition
和QMutex
。以下是一些灵感来源:
- Just Software Solutions' blog article .
- Java BlockingQueue
- ZThreads 的 BlockingQueue
虽然 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/