假设机器数量为4,情况如下:
1、在4台机器上各执行一个同样的c++程序P,任意两个程序间可通信
2、每个程序P都有自己的一套ini配置文件
3、程序P启动时会加载ini文件的配置到内存中,执行过程中会修改内存中的配置并更新ini文件
4、要对所有程序都做同样的修改,必须手动对每一个程序进行修改操作才行问题是:
1、如何能实现:只修改一个程序的内存中的配置,则能让所有的程序都成功地同步修改各自内存和ini文件?即保证所有程序的内存和ini配置都是一致的?

解决方案 »

  1.   

    你监视一下文件变化即可了。
    SHChangeNotifyRegister和 SHChangeNotifyDeregister
      

  2.   

    仅仅监测到某个程序P0下的ini文件有变化 是不够的
    即使检测到了,并将ini文件同步传到其它程序的对应路径,但其它程序不能通过重新加载ini的方式将新的配置读到内存当中,因为重新加载的时间太长了,根本不能接受
      

  3.   


    那你别用ini的操作API了,那个API是很慢,文件10k以上就慢了。
    你可以自己写相关的操作,用内存映射文件读ini文件到内存,然后我们一直修改内存。
      

  4.   

    你的目的不是“只修改一个程序的内存中的配置,则能让所有的程序都成功地同步修改各自内存和ini文件”吗?那么:
    1、修改P0内存中的配置。
    2、与P1~P3通讯,通知它们修改配置。
    3、P1~P3收到通知后,修改自己内存中的配置,并存盘。
    4、P0自己存盘。当然,前提是:1、没有人会去手工(用记事本之类)改你的ini文件;2、所有的程序都同时启动,或者至少你在改动P0的配置的时候,P1~P3都是启动的。
      

  5.   

    确实,对于稍大点的文件,GetPrivateProfileInt这样的操作巨慢
    一直修改内存没有问题,但要求内存中的内容必须写到ini文件中,这样比如程序重启的时候才有的加载啊。
    始终有一大要求就是所有程序的内存中的配置必须一致,即使在修改的过程中,不一致的时间也不能超过几分钟
      

  6.   

    我用SOCKET实现过类似的功能,但是有时间延迟的。不知道大家有什么好的办法
      

  7.   

    ini文件的操作比较简单,自己实现一个类似于CStudioFile的就可以了,直接操作内存。
      

  8.   

    想要内存一致,就用同步机制:
    1、P0从用户界面收集到配置信息的修改。
    2、P0把原来的配置在内存中保留一份,然后在内存中修改配置,如果不成功,则恢复原来配置。
    3、P0给P1~P3发消息,并等待对方回复。此过程中P0不响应任何其它消息或事件。
    4、P1~P3收到消息后,修改配置,如果不成功则恢复原来配置,并回复P0“ERROR”,若成功则回复“OK”。
    5、P1~P3等待P0最终通知。
    6、P0收到P1~P3的所有回复后,如果其中有“ERROR”,则再给P1~P3发消息,通知它们取消修改,并且自己也取消修改。如果所有回复都是“OK”,则给P1~P3发消息,通知它们将修改保存,并且自己也保存修改。
    7、P1~P3接到最终通知后,如果是取消,那么恢复原来配置,否则保存修改。当然,这个过程的前提是网络一直畅通。如果网络不通(比如发送最终通知的时候突然中断,或者你的某个程序突然崩溃),任你什么办法也无法保持配置一致。
      

  9.   

    厉害,这个步骤更完善了,相当于程序内部实现了回滚,很好
    至于网络不通,用session的方式能解决一部分问题,但要完全解决网络不通导致的不同步,确实不大可能哈
    3q so much
      

  10.   

    我的想法是这样的,每个程序都设置个变量存放INI的文件的信息,只要其中一台的的该变量发生了变化,说明INI改变了,把变量改变后的值发送给别的程序,使其他程序同步更新