Qt - открытие нескольких копий одного приложения и синхронизация настроек - PullRequest
4 голосов
/ 17 мая 2010

У меня довольно стандартное приложение Qt GUI. Он использует QSettings Qt для хранения ряда настроек, и все это прекрасно работает.

Однако при запуске нескольких копий приложения и изменении настроек в одной или другой копии могут казаться несовместимыми (поскольку у одной есть «старая» копия данных).

Каковы предпочтительные решения этой проблемы? Я полагаю, эта проблема возникает даже за пределами Qt арены.

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Документы QSettings упоминают об этом в Доступ к настройкам из нескольких потоков или процессов одновременно раздел:

  • QSettings можно безопасно использовать из разных процессов (которые могут быть разными экземплярами приложения, запущенного в одно и то же время, или из разных приложений в целом) для чтения и записи в одни и те же места системы. Он использует консультативную блокировку файлов и алгоритм интеллектуального объединения для обеспечения целостности данных. Изменения, выполненные другим процессом, не отображаются в текущем процессе, пока не будет вызвана функция sync ().

Вы пытались вызвать yoursettings.sync () из приложения для записи после записи значений и из приложения для чтения перед их чтением? Если это так, и если ваша логика верна, это звучит как ошибка Qt.

0 голосов
/ 06 апреля 2018

Я столкнулся с той же проблемой. Существует функция QSettings::sync(), но, похоже, она требует целостности файла настроек (INI, реестра и т. Д.), Чем согласование настроек с состоянием приложения. Под этой «согласованностью» я подразумеваю, например, что когда я, как пользователь, изменяю размер шрифта в диалоговом окне настроек, я ожидаю, что все приложение будет перекомпоновано и перекрашено. Этого легко достичь в одном приложении (используя сигнальные слоты, события и т. Д.). Но когда у меня запущено два или более приложений, другие экземпляры не получают информации о том, что параметры размера шрифта были изменены, они не перераспределяются и не перерисовываются, а позже, когда любой виджет отображается с использованием нового размера шрифта, инициализированного из QSettings , это становится несовместимым с остальной частью приложения, и макет может быть поврежден.

Однако есть решение для этого. Требуется добавить еще один уровень «кэширования» для всех настроек, выше QSettings. Все настройки будут загружены в некоторый класс данных настроек с помощью QSettings::value(...) только при запуске приложения, а во время запуска приложения приложение не будет напрямую считывать из QSettings::value(), а только из кеша. Таким образом, вы будете иметь полностью последовательное поведение. Когда пользователь изменяет некоторые настройки в диалоговом окне настроек, каждый элемент сравнивается с кэшированным значением (т. Е. Проверяет, изменил ли пользователь его) и, если оно не равно, записывается в настройки с использованием QSettings::setValue().

// To be created at application startup, just after
// QApplication::setApplication(), setOrganizationName() etc. is called.
// When the application is running, you only obtain cached values
// from the instance of Settings instead of querying QSettings.
class Settings
{
    Settings() { 
        m_x = QSettings().value("x", 0).toInt(); 
    }

    int x() const {
        return m_x;
    }

    void setX(int x) {
        if (x == m_x)
            return;
        m_x = x;
        QSettings().setValue("x", x);
    }

private:
    int m_x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...