0

我有一个类(在 C++ 中),调用它Data,当代码运行时它有数千个实例(对象)。我有一个小部件(在 Qt 中),调用它DataWidget来显示对象的属性。为了快速构建小部件,我只是将对象属性写入文件并让小部件解析文件中的属性 - 这种方法有效,但不可扩展或不美观。

更清楚地说,我的要求是:
1 -DataWidget应该能够同时显示多个不同的Data对象属性
2 -DataWidget应该能够Data每秒显示数千个对象
3 -DataWidget应该与生成新Data对象的代码一起运行
4 - 每个Data对象都需要永久保存到文件/数据库

目前,GUI 已创建并DataWidget创建,然后实验运行并生成数千个Data对象(定期将其中一些写入文件)。实验运行后,DataWidget显示最后Data写入文件的对象(它们被写入 XML 文件)。

使用我当前的文件方法,我可以通过在实验运行后抓取多个文件来满足(1) 。由于实验与无关,因此没有并发性,因此在添加一个通知新文件存在的信号之前DataWidget,我无法执行(3) 。DataWidget

我没有继续使用这种方法有两个原因:首先,即使文件没有立即写入磁盘,我无法想象这种方法是可扩展的,除非实现一个缓存系统——但是,这似乎是我我要重新发明轮子?其次,Data是图形数据结构的包装器,我正在使用 Graphml(通过 Boost 图形库,即write_graphml())将结构写入 XML 文件,并使用 Boost 的read_graphml()将结构读回需要我将文件读回Data对象...这意味着程序的实验部分将对象编码为 XML,将 XML 写入文件(但希望在内存中而不是磁盘中),然后DataWidget从文件中读取 XML 并将其解码为对象!

在我看来,我应该使用一个可以处理所有缓存等的数据库。此外,似乎我应该能够跳过文件/数据库Data步骤DataWidget并将的列表Data)。然而,我还想将文件保存Data到文件/数据库步骤并非完全没有意义——我只是在错误的时间以错误的方式使用它。

考虑到我的要求,更好的方法是什么?

是否有任何通用资源和/或指南来处理和显示此类数据?

4

3 回答 3

1

在我看来,我应该使用一个可以处理所有缓存等的数据库。此外,我似乎应该能够跳过文件/数据库步骤并将数据传递给程序中的 DataWidget(也许将它传递给参考数据列表)。然而,我还想将数据保存到文件/数据库步骤并非完全没有意义——我只是在错误的时间以错误的方式使用它。

如果您需要显示如此快速变化的数据,拥有中间文件或数据库会减慢速度并可能成为瓶颈。我认为 Widget 应该直接从内存中读取新生成的数据。不过,这并不妨碍您将数据存储在文件或数据库中,它可以在单独的线程/进程中完成。

于 2009-04-24T15:04:23.210 回答
1

如果所有数据项都适合内存,我会说将它们放在向量/列表中,并将对它的引用传递给 DataWidget。当需要保存它们时,将引用传递给您的序列化方法。然后,您的实验只是填充数据结构以供其他进程使用。

于 2009-04-24T15:21:05.823 回答
1

我看到你正在使用 Qt。这很好,因为 Qt 4.0 及更高版本包含一个强大的模型/视图框架。我认为这就是你想要的。

模型/视图

基本上,让您的Data类继承并实现 QAbstractItemModel 或不同的 Qt Model 类,具体取决于您想要的模型类型。然后设置您的视图小部件(很可能是 QListView)以Data用于其模型。

他们的站点上有很多示例,并且该解决方案可以很好地适应大型数据集。

补充:来自 labs.trolltech.com 的模型测试代码非常方便:

http://labs.trolltech.com/page/Projects/Itemview/Modeltest

于 2009-04-24T17:02:29.997 回答