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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к централизованным данным  (Прочитано 5013 раз)
once_again_abc
Гость
« : Сентябрь 27, 2011, 16:17 »

Есть некие настройки, к которым надо обращаться из разных классов и потоков. Классы ничего друг о друге не знают. Естественно хочется иметь одну единственную переменную, содержащую настройки вместо дублирования информации в каждом классе. Так же хочется, чтобы класс работал с актуальными данными, т.е. настройки должны быть некой глобальной переменной по отношению к классам-пользователям, а сами классы должны использовать какой-то унифицированный интерфейс для доступа к настройкам. как это в С++ грамотно решается? не хочется изобретать велосипед...
Записан
Rem Norton
Гость
« Ответ #1 : Сентябрь 27, 2011, 16:54 »

Если настройки читаются из файла или реестра, то можно например вот так:

Код
C++ (Qt)
// где-то вначале (в *.cpp главного окна)
QSettings* set = new QSettings("./myconf.ini",QSettings::IniFormat);
qApp->setProperty("conf",(int)set);
...
 
// где-то в каком-то классе приложения
QSettings* set = (QSettings*) qApp->property("conf").toInt();
set->sync(); //синхронизировали с файлом
//дальше читаем/пишем (см. доку, там все есть)
 

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Сентябрь 27, 2011, 19:46 »

Смотри в сторону синглтона, для настроек самое оно.
Записан
asvil
Гость
« Ответ #3 : Сентябрь 27, 2011, 21:40 »

глобальная переменная. па-баааааааам.
Записан
once_again_abc
Гость
« Ответ #4 : Сентябрь 28, 2011, 00:04 »

а паттерн flyweight не то? особенно с учетом того, что настроек ну просто очень много...
Записан
once_again_abc
Гость
« Ответ #5 : Сентябрь 28, 2011, 00:19 »

хотя, в принципе, подход который я использовал с самого начала является самым правильным. если это не так, поправьте.
я создал свой класс-синглтон (наследник QSettings) в котором реализована потокова безопасность, а в остальном класс просто перенаправляет запросы родительскому классу.

вопрос в том, насколько быстро происходит обращение и не является ли такой подход ошибкой если к данным идет очень частое обращение из разных классов и  потоков?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #6 : Сентябрь 28, 2011, 09:20 »

Добавь в свой класс настроек еще и кеширование. При записи настройки пишешь ее в кэш и в файл(допустим) при чтении проверяешь если нет в кэше берешь из файла и опять же пишешь в кеш. Это прилично ускорит работу с настройками, и ты будешь знать что для получения одной настройки софтина максимум 1 раз обратиться к файлу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 28, 2011, 09:42 »

Добавь в свой класс настроек еще и кеширование.
Это создаст трудные (а может и неразрешимые) проблемы с "многопоточностью", т.к. Qt кэш не thread-safe

я создал свой класс-синглтон (наследник QSettings) в котором реализована потокова безопасность, а в остальном класс просто перенаправляет запросы родительскому классу.

вопрос в том, насколько быстро происходит обращение и не является ли такой подход ошибкой если к данным идет очень частое обращение из разных классов и  потоков?
Мне неизвестен какой-то стандартный/канонический способ. Если Вы только читаете установки - то вообще нет проблемы, никакие мутексы не нужны. Если же еще и пишете - ну тогда непонятно, а устроит ли Вас изменение параметра "на ходу", когда он уже прочитан одной или более нитками. Более определенно можно сказать имея конкретный пример использования.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Сентябрь 28, 2011, 10:26 »

Цитировать
Это создаст трудные (а может и неразрешимые) проблемы с "многопоточностью", т.к. Qt кэш не thread-safe

а мьютексы тут не помогут ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Сентябрь 28, 2011, 10:51 »

а мьютексы тут не помогут ?
Да скорее навредят (если речь о QMutex)
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #10 : Сентябрь 28, 2011, 11:10 »

да, о них, не так часто с ними работал, решил уточнить. Вроде же была какая то возможность запретить доступ к переменной если ее уже кто то юзает.... совсем забыл
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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