Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt信号/插槽上下文中使用观察者模式_C++_Qt_Design Patterns - Fatal编程技术网

C++ 在Qt信号/插槽上下文中使用观察者模式

C++ 在Qt信号/插槽上下文中使用观察者模式,c++,qt,design-patterns,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 resultin

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

以下是我正在努力实现的算法:

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

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

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


感谢您的帮助。

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


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

您的问题并不完全清楚,但您似乎希望将工作分成多个线程,以便在完成加载整个图像集之前开始平铺处理

考虑一个多线程处理管道体系结构。为每个任务分配一个线程(加载、复制、处理),并通过队列(也称为BlockingQueue)在任务之间传递平铺。更准确地说,将指针(或共享指针)传递给平铺以避免不必要的复制

Qt中似乎没有现成的线程安全阻塞队列类,但您可以使用
QQueue
QWaitCondition
QMutex
来汇总自己的类。以下是一些灵感来源:

  • 只是软件解决方案
  • 爪哇的
  • ZThreads's
虽然Qt中没有现成的阻塞队列,但似乎将signals&slot与该选项一起使用也可以达到同样的目的。这个Qt利用了信号和插槽

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

以下是管道的概念草图:

TilePool -> TileLoader -> PCQ -> TileProcessor -> PCQ -> TileSaver -\
  ^                                                                 |
   \----------------------------------------------------------------/
其中,
PCQ
表示生产者-消费者队列

为了利用更多的并行性,您可以在每个阶段进行尝试


你也可以考虑看看英特尔的。我自己没试过。请注意开放源代码版本的GPL许可证。

是的,文件非常大-8GB+。我用来读取文件的GDAL库有一个共享的I/O例程,它允许我基本上在文件中的不同位置查找,以从我使用的格式提取数据块