Russian Qt Forum
Сентябрь 30, 2024, 14:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение ключей из QSettings  (Прочитано 4380 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Август 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;
}
Записан
Bepec
Гость
« Ответ #1 : Август 23, 2013, 08:27 »

Эммм... Как то бредово, если честно, выглядит ваше утверждение, что может запороть корректность. Сделайте функцию с параметром - именем группы, дети которой нужны.

PS по моему у вас архитектура тю тю.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Август 23, 2013, 08:39 »

Цитировать
Как то бредово, если честно, выглядит ваше утверждение, что может запороть корректность
Я решил считать все элементы группы, вызвал begingroup, в это время другой поток захочет считать значение, в результате qsettings допишет к названию ключа группу и не найдет значение.

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

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

хотелось бы childkeys(QString group)
« Последнее редактирование: Август 23, 2013, 08:56 от deMax » Записан
Bepec
Гость
« Ответ #3 : Август 23, 2013, 09:00 »

Бредово в смысле использовать один QSettings.

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

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

PS попробуйте.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Август 23, 2013, 09:25 »

Цитировать
Бредово в смысле использовать один QSettings.
Времени пока нету на них тратить. Настройки не большие, пока работают да и ладно. Запись в настройки производиться оператором и это явление редкое, чтение с учетом кеша диска... не будет проблемным.
Реализовал через дополнительное поле.
« Последнее редактирование: Август 23, 2013, 09:28 от deMax » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #5 : Август 23, 2013, 13:09 »

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

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Bepec
Гость
« Ответ #6 : Август 23, 2013, 13:37 »

Завершение может быть и аварийным ^.^
Я не спорю, что резервное надо делать после каждого изменения настроек.
 Но вот с его подходом один QSettings - бредово Улыбающийся
Записан
voral
Гость
« Ответ #7 : Август 23, 2013, 15:33 »

Но вот с его подходом один QSettings - бредово Улыбающийся
Поддерживаю. По теме. Как бы берем код из асситента:
Код:
 QSettings settings("MySoft", "Star Runner");
 QColor color = settings.value("DataPump/bgcolor").value<QColor>();
он вроде как бы намекает на отсутствие обязаловки использовать beginGroup.....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 23.