dearbub 2023-10-27 15:24 采纳率: 0%
浏览 6

如何解决多进程间对象添加/删除/编辑的同步管理问题?

当前有一个软件结构,采用了前后不同语言开发的、多进程组织的结构形式,如下图所示:

1、后端使用C++开发;前端使用.Net/Vue开发;(为什么不采用一套语言机制,属历史问题,不讨论了。)

2、后端负责逻辑性的运算执行,按功能划分不同的EXE,存在多个(约20来个)程序,都是周期性的定时逻辑;每个程序会按照逻辑需要(设计)加载配置文件或记录,产生支持周期性逻辑的数据结构对象(各种面向对象);

3、前端负责结果呈现,尽量不含逻辑性的内容;

4、数据库保存软件运行所需的配置文件(XML/JSON)、内容记录(设备档案等)、数据记录(数值)等;前后端均可对数据库进行读写。

问题:以设备保养计算为例进行举例说明,如何解决前端添加一个设备后、该添加的操作记录写入数据库(配置文件),后端设备保养计算逻辑的程序能够获知该设备添加,并能在程序内建立设备对象,并完成运算?

当前已尝试过的思路:

1、添加设备后(更改配置或记录),重启指定或全部后台程序。但此方法会中断软件执行,即为了添加一个设备就整套重启,导致前端无影响,中断操作,不科学。

2、添加设备后(更改配置或记录),重新初始化程序配置文件或内存数据结构对象,在不停程序的情形下完成进程间对象的创建、删除和编辑。首先,此办法较为麻烦,后端20多个程序每个配置文件格式不同,每个程序要加载的配置文件和记录数量不同,且重新初始化也会中断操作逻辑,不通用、也不科学。

3、过程调用(RPC),就现在的设计来说,所有程序均在一台服务器机器上运行,选用RPC显得过于复杂了,但从功能上来说,设计的软件体量还小,而RPC本身就已经很大了。且需要一套支持Windows、SQLServer\PostgreSQL、C++.Net的RPC也不太好找。

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-28 00:26
    关注

    【以下回答由 GPT 生成】

    解决方案:

    针对多进程间对象添加/删除/编辑的同步管理问题,可以使用消息队列(Message Queue)来实现进程间的通信和同步。

    消息队列是一种先进先出的数据结构,进程可以将消息发送到队列中,而其他进程则可以从队列中接收消息。通过消息队列,后端程序可以监听前端的设备添加消息,并在收到消息后更新配置文件或内存数据结构对象。

    下面是一个使用消息队列实现多进程间对象同步管理的示例代码:

    1. 首先,需要在后端程序中创建一个消息队列,并监听消息:
    #include <iostream>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    
    // 定义消息结构体
    struct DeviceMessage {
        long messageType;  // 消息类型
        // 其他设备相关字段
    };
    
    int main() {
        // 创建消息队列
        key_t messageKey = ftok(".", 'm');  // 根据路径和项目标识创建消息队列的key
        int messageQueueId = msgget(messageKey, IPC_CREAT | 0666);  // 创建或获取消息队列
        if (messageQueueId == -1) {
            std::cerr << "Failed to create message queue." << std::endl;
            return -1;
        }
    
        // 监听消息
        DeviceMessage message;
        while (true) {
            // 接收消息
            msgrcv(messageQueueId, &message, sizeof(message), 0, 0);
    
            // 处理消息,进行设备对象的添加/删除/编辑操作
            // 根据需要更新配置文件或内存数据结构对象
        }
    
        return 0;
    }
    
    1. 前端在添加设备时,向消息队列发送消息:
    using System;
    using System.Messaging;
    
    public class DeviceManagement {
        public static void AddDevice() {
            // 连接消息队列
            MessageQueue messageQueue = new MessageQueue(@".\Private$\DeviceQueue");  // 根据消息队列路径连接到消息队列
            messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(DeviceMessage) });
    
            // 创建设备消息
            DeviceMessage message = new DeviceMessage {
                // 设置设备相关字段
            };
    
            // 发送消息
            messageQueue.Send(message);
        }
    }
    

    使用消息队列可以将前端的设备添加消息发送给后端程序,后端程序通过监听消息队列可以接收到设备添加消息,并进行相应的处理。这样可以在不停止程序的情况下,实现多进程间的对象同步管理。

    请注意,以上代码仅为示例,具体实现需要根据具体情况进行调整。例如,可以根据需要定义消息的具体字段和类型,并在接收消息时进行相应的处理操作。



    【相关推荐】


    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7651629
    • 除此之外, 这篇博客: Educational Codeforces Round 102 (Rated for Div. 2)中的 思路:首先考虑在没有删除的情况下,一系列操作过程中,能变成多少不同的值。x初始为0,随着+±-的变化,会来回反复横跳,那么两个关键点就是最大值和最小值,这说明从最大值到最小值之间的数字,都是在操作过程中出现。所以只需要考虑一个区间内的操作产生的最大最小值。但是题目要删掉,中间一段,剩下两段,也就是要把两段合并起来。画个图其实更好理解。红色的是所有的操作,绿色的是要删除的操作,第二个曲线就是合并之后的x值变化曲线。由图可知。后面那部分合并过来之后,起点就是前面那部分的终点!这就是关键点。然后前面那部分的区间的最大最小值和当前值都很好维护。难的是后面那部分怎么维护。后面那部分,从后往前维护,每到一个点,都认为这个点是零点,然后计算最大值最小值。因为是反着来,可以发现操作曲线是一个与 原操作 关于x轴对称的曲线,所以最大值就是最小值,最小值就是最大值。然后最小值就是 当前点到最小值的距离,最大值就是 当前点到最大值的距离。之所以算距离,是因为,永远认为当前点是0点。所以 距离 才是真正的最大最小值。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月27日

悬赏问题

  • ¥100 iOS开发关于快捷指令截屏后如何将截屏(或从截屏中提取出的文本)回传给本应用并打开指定页面
  • ¥15 unity连接Sqlserver
  • ¥15 图中这种约束条件lingo该怎么表示出来
  • ¥15 VSCode里的Prettier如何实现等式赋值后的对齐效果?
  • ¥15 流式socket文件传输答疑
  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接