Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deMax от Август 23, 2013, 08:17



Название: Чтение ключей из QSettings
Отправлено: deMax от Август 23, 2013, 08:17
Можно ли выполнить данный код без использования begingroup
Код:
 settings.beginGroup("fridge");
 keys = settings.childKeys();

Приложение многопоточное и конструкция begingroup может запороть корректность чтения настроек из других потоков. Сам класс использует статические методы для работы с настройками:

Код:
class Settings
{
    static Settings & instance();
    QSettings *settings; 
public:
    inline static void     setValue( QString key, QVariant value )                  {        instance().settings->setValue(key, value); }
...
}

Settings & Settings::instance()
{
    static Settings singletone;
    return singletone;
}


Название: Re: Чтение ключей из QSettings
Отправлено: Bepec от Август 23, 2013, 08:27
Эммм... Как то бредово, если честно, выглядит ваше утверждение, что может запороть корректность. Сделайте функцию с параметром - именем группы, дети которой нужны.

PS по моему у вас архитектура тю тю.


Название: Re: Чтение ключей из QSettings
Отправлено: deMax от Август 23, 2013, 08:39
Цитировать
Как то бредово, если честно, выглядит ваше утверждение, что может запороть корректность
Я решил считать все элементы группы, вызвал begingroup, в это время другой поток захочет считать значение, в результате qsettings допишет к названию ключа группу и не найдет значение.

Цитировать
PS по моему у вас архитектура тю тю.
Стандартное и красивое решение, мне нужен класс настроек к которому имеют доступ многие классы. Обращение к настройкам происходит через статические методы QSettings::getValue(key);

Решений вижу несколько:
1) создать Mutex и блокировать работу с настройками, во время тупой функции begingroup-endgroup. (не стоит свеч, еще и другие потоки тормозить из за всяких недодуманных функций)
2) использовать Allkeys(). (Пойду этим путем)
3) хранить список ключей в параметре настрек, чтобы не использовать childkeys
...
Заменить QSettings нормальным классом

хотелось бы childkeys(QString group)


Название: Re: Чтение ключей из QSettings
Отправлено: Bepec от Август 23, 2013, 09:00
Бредово в смысле использовать один QSettings.

Я думаю, вам стоит считывать настройки в начале работы программы и хранить внутри в какой-либо структуре. А при закрытии/завершении сохранять в QSettings.

Ну или как вариант в этой функции создавайте новый QSettings и отдавайте его childKeys.

PS попробуйте.


Название: Re: Чтение ключей из QSettings
Отправлено: deMax от Август 23, 2013, 09:25
Цитировать
Бредово в смысле использовать один QSettings.
Времени пока нету на них тратить. Настройки не большие, пока работают да и ладно. Запись в настройки производиться оператором и это явление редкое, чтение с учетом кеша диска... не будет проблемным.
Реализовал через дополнительное поле.


Название: Re: Чтение ключей из QSettings
Отправлено: panAlexey от Август 23, 2013, 13:09
Бредово в смысле использовать один QSettings.
Я думаю, вам стоит считывать настройки в начале работы программы и хранить внутри в какой-либо структуре. А при закрытии/завершении сохранять в QSettings.
А я бы руки поотбивал за такой подход.
Сколько раз приложение вылетало а потом приходилось заново выставлять настройки.
Я за то, что-бы настройки сериализовались в момент установки и считывались когда понадобятся.
Тем паче если прога сетевая и администратору надо порыхлому быстро че-нить оттюнить.
ПС. Кешь конечно дело, но потеря настроек - не хорошо.


Название: Re: Чтение ключей из QSettings
Отправлено: Bepec от Август 23, 2013, 13:37
Завершение может быть и аварийным ^.^
Я не спорю, что резервное надо делать после каждого изменения настроек.
 Но вот с его подходом один QSettings - бредово :)


Название: Re: Чтение ключей из QSettings
Отправлено: voral от Август 23, 2013, 15:33
Но вот с его подходом один QSettings - бредово :)
Поддерживаю. По теме. Как бы берем код из асситента:
Код:
 QSettings settings("MySoft", "Star Runner");
 QColor color = settings.value("DataPump/bgcolor").value<QColor>();
он вроде как бы намекает на отсутствие обязаловки использовать beginGroup.....