2011-02-14 85 views
1

我们正在开发一个复制工具,它定期将客户机中的不同文件夹复制到服务器计算机上。C++中的数据持久性 - 建议更好的方法

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

果壳:

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

现在,我们需要某些计数器,例如发送的总字节数,接收到的总字节数,最后一次复制时间等等,以便复制每个文件夹。只要我们的服务正在运行,这些计数器就需要保持(不需要在我们的服务/计算机重新启动时保持这一点)。

要纳入这些变化,我们正在讨论两种方法。

请注意 - 计数器需要跨越复制周期进行维护。

Approach1:对象重用

使复制的柜台部分,接收对象,并保持接收只要服务是活的复制对象活着。 现在对于线程,可以采取以下任何一种方法。

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

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

Approach2:封装

封装的计数器在一个单独的类。现在每当一个接收/复制对象被实例化用于复制一个文件夹。要么

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

OR

  1. 接收/复制对象询问柜台对象科尔的文件夹管理器。

其中approach1 & approach2更好,为什么?

回答

0

我会去第二种方法。考虑一次复制多个文件的场景。你目前的设计已经支持这个,只是用它的复制对象产生另一个线程。

如果你走第二条路线,你仍然可以让counter对象留在主线程中,从工作线程接收信号来更新计数器。然而,第一种方法不会支持这种情况。

另一种情况:实时查看计数。如果你有一个gui或者其他表示当前数据速率的东西,它不应该在工作线程中运行。无论如何,你必须发信号给gui线程。在那个地方做完计数已经来得方便了。

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