Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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/design-patterns/2.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/file/3.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++ C+中的数据持久性+;-建议更好的方法_C++_Design Patterns_Class Design - Fatal编程技术网

C++ C+中的数据持久性+;-建议更好的方法

C++ C+中的数据持久性+;-建议更好的方法,c++,design-patterns,class-design,C++,Design Patterns,Class Design,我们正在开发一个复制工具,它定期将不同的文件夹从客户机复制到服务器机 当必须复制特定文件夹时,会在客户端创建一个复制对象(由我们的服务模块创建),该对象通过网络将文件夹中存在的文件的内容发送到服务器。在服务器上(由我们的服务模块)创建一个相应的接收对象,该对象接收文件 简而言之: 客户端抽象—复制对象(在自己的线程中运行),其职责是发送文件。 服务器端抽象-接收对象(在自己的线程中运行),职责是接收内容并创建/更新文件 现在,我们还需要一些计数器,比如发送的总字节数、接收的总字节数、上次复制时间

我们正在开发一个复制工具,它定期将不同的文件夹从客户机复制到服务器机

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

简而言之:

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

现在,我们还需要一些计数器,比如发送的总字节数、接收的总字节数、上次复制时间等等。。。对于要复制的每个文件夹。只要服务在运行,这些计数器就需要持久化(不需要在服务/机器重新启动时持久化)

为了整合这些变化,我们正在讨论两种方法

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

方法1:对象重用

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

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

  • 允许线程退出,持久化正在复制的接收对象。现在在下一个复制周期中;复制、接收对象重新创建线程或从线程池获取线程

  • 方法2:封装

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

  • 将计数器对象corr.作为接收/复制对象构造函数的参数传递给文件夹

  • 接收/复制对象向管理器请求文件夹的计数器对象

  • 在方法1和方法2中比较好,为什么?

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

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

    另一个场景:实时查看计数。如果您有一个gui或任何显示当前数据速率的东西,那么它不应该在工作线程中运行。无论如何,您都必须向gui线程发送信号。在那个地方数数已经很方便了

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