QSettings - проблема синхронизации между двумя процессами - PullRequest
0 голосов
/ 26 августа 2011

Я использую Qsettings для продуктов, не относящихся к графическому интерфейсу, для сохранения своих настроек в файлах xml.Это написано как библиотека, которая используется в программах на C, C ++.Там будет 1 файл XML-файл для каждого продукта.Каждый продукт может иметь более одного субпродукта, и они записываются в XML по группам субпродуктов следующим образом -

Файл: "product1.xml"

<product1>
    <subproduct1>
       <settings1>..</settings1>
       ....
       <settingsn>..</settingsn>
    </subproduct1>
    ...
    <subproductn>
       <settings1>..</settings1>
       ....
       <settingsn>..</settingsn>
    </subproductn>

 </product1>

Файл: productn.xml

<productn>
   <subproduct1>
       <settings1>..</settings1>
       ....
       <settingsn>..</settingsn>
   </subproduct1>
   ...
   <subproductn>
       <settings1>..</settings1>
       ....
       <settingsn>..</settingsn>
   </subproductn>

 </productn>

Код в одном процессе выполняет следующее -

settings = new QSettings("product1.xml", XmlFormat);
settings.setValue("settings1",<value>)
sleep(20);
settings.setValue("settings2", <value2>)
settings.sync();

Когда первый процесс переходит в спящий режим, я запускаю другой процесс, которыйвыполняет следующее -

settings = new QSettings("product1.xml", XmlFormat);
settings.remove("settings1")
settings.setValue("settings3", <value3>)
settings.sync();

Я бы ожидал, что settings1 будет удален из файла product1.xml, но он все еще сохранится в файле - product1.xml в конце двух предыдущих процессов.Я не использую QCoreApplication (..) в моей библиотеке настроек.Пожалуйста, укажите проблемы, если в вышеуказанном дизайне что-то не так.

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Это довольно странная вещь, которую вы делаете, но следует отметить, что вызов sync () - это то, что фактически записывает файл на диск.В этом случае, если вы хотите, чтобы ваш второй процесс действительно видел внесенные вами изменения, вам нужно вызвать sync () до того, как ваш второй процесс получит доступ к файлу, чтобы гарантировать, что он действительно будетувидеть ваши модификации.Таким образом, я бы попробовал сделать settings.sync() вызов прямо перед вашим sleep(20)

0 голосов
/ 26 августа 2011

Это компилируется? Какую реализацию XmlFormat вы используете и какую ОС? В вашем проекте должен быть какой-то специальный код для хранения / чтения в и из Xml - в этом коде должно быть что-то, что работает иначе, чем вы ожидаете.

0 голосов
/ 26 августа 2011

Может быть, вам нужно сделать delete settings; после sync(), чтобы убедиться, что он не открыт, а затем выполнить запись в другом процессе?

...