【问题标题】:Data Persistence in C++ - Suggest better approachC++ 中的数据持久性 - 建议更好的方法
【发布时间】:2011-02-14 16:55:10
【问题描述】:

我们正在开发一种复制工具,它可以定期将不同文件夹从客户端计算机复制到服务器计算机。

当必须复制特定文件夹时,会在客户端创建一个复制对象(由我们的服务模块),该对象通过网络将文件夹中存在的文件的内容发送到服务器。在服务器上创建一个相应的接收对象(由我们的服务模块)接收文件。

简而言之:

客户端抽象 - 复制对象(在自己的线程中运行),其职责是发送文件。 服务器端抽象 - 接收对象(在自己的线程中运行),负责接收内容并创建/更新文件。

现在,我们需要某些计数器,例如发送的总字节数、接收的总字节数、上次复制时间……对于每个被复制的文件夹,还有一个额外的要求。只要我们的服务正在运行,这些计数器就需要保持(不需要在我们的服务/机器重新启动时保持这个)。

要合并这些更改,我们正在讨论两种方法。

请注意 - 需要在复制周期中维护计数器。

方法1:对象重用

使计数器成为复制、接收对象的一部分,并在服务处于活动状态时保持接收和复制对象的活动状态。 现在对于线程,可以采取以下任何一种方法。

  1. 使对象和线程保持活动状态(线程进入睡眠状态)。现在在下一个复制周期中,对象和线程(唤醒线程)被重新使用。

  2. 允许线程退出,保留复制、接收对象。现在在下一个复制周期;复制、接收对象重新创建线程或从线程池中获取线程。

方法2:封装

将计数器封装在一个单独的类中。现在,每当实例化接收/复制对象以复制文件夹时。要么

  1. 传递计数器对象,更正。到文件夹作为接收/复制对象构造函数的参数。

  1. 接收/复制对象向管理器请求文件夹的计数器对象更正。

在方法 1 和方法 2 中更好,为什么?

【问题讨论】:

    标签: c++ design-patterns class-design


    【解决方案1】:

    我会选择第二种方法。考虑一次复制多个文件的场景。您当前的设计已经支持这一点,只需使用其复制对象生成另一个线程。

    如果您选择第二条路线,您仍然可以让计数器对象保留在主线程中,接收来自工作线程的信号以更新计数器。但是,第一种方法不支持这种情况。

    另一种情况:计数的实时视图。如果你有一个 gui 或任何呈现当前数据速率等的东西,它不应该在工作线程中运行。无论如何,您都必须向 gui 线程发出信号。在那个地方完成计数已经很方便了。

    总结一下:对我来说,在您的情况下,第二种方法似乎更灵活。它也是对当前设计引入较少更改的一种(您仍然可以丢弃您的对象并继续使用每个复制都有自己的对象范例)。

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      相关资源
      最近更新 更多