Russian Qt Forum

Программирование => С/C++ => Тема начата: once_again_abc от Сентябрь 27, 2011, 16:17



Название: Доступ к централизованным данным
Отправлено: once_again_abc от Сентябрь 27, 2011, 16:17
Есть некие настройки, к которым надо обращаться из разных классов и потоков. Классы ничего друг о друге не знают. Естественно хочется иметь одну единственную переменную, содержащую настройки вместо дублирования информации в каждом классе. Так же хочется, чтобы класс работал с актуальными данными, т.е. настройки должны быть некой глобальной переменной по отношению к классам-пользователям, а сами классы должны использовать какой-то унифицированный интерфейс для доступа к настройкам. как это в С++ грамотно решается? не хочется изобретать велосипед...


Название: Re: Доступ к централизованным данным
Отправлено: Rem Norton от Сентябрь 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(); //синхронизировали с файлом
//дальше читаем/пишем (см. доку, там все есть)
 



Название: Re: Доступ к централизованным данным
Отправлено: ecspertiza от Сентябрь 27, 2011, 19:46
Смотри в сторону синглтона, для настроек самое оно.


Название: Re: Доступ к централизованным данным
Отправлено: asvil от Сентябрь 27, 2011, 21:40
глобальная переменная. па-баааааааам.


Название: Re: Доступ к централизованным данным
Отправлено: once_again_abc от Сентябрь 28, 2011, 00:04
а паттерн flyweight не то? особенно с учетом того, что настроек ну просто очень много...


Название: Re: Доступ к централизованным данным
Отправлено: once_again_abc от Сентябрь 28, 2011, 00:19
хотя, в принципе, подход который я использовал с самого начала является самым правильным. если это не так, поправьте.
я создал свой класс-синглтон (наследник QSettings) в котором реализована потокова безопасность, а в остальном класс просто перенаправляет запросы родительскому классу.

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


Название: Re: Доступ к централизованным данным
Отправлено: ecspertiza от Сентябрь 28, 2011, 09:20
Добавь в свой класс настроек еще и кеширование. При записи настройки пишешь ее в кэш и в файл(допустим) при чтении проверяешь если нет в кэше берешь из файла и опять же пишешь в кеш. Это прилично ускорит работу с настройками, и ты будешь знать что для получения одной настройки софтина максимум 1 раз обратиться к файлу.


Название: Re: Доступ к централизованным данным
Отправлено: Igors от Сентябрь 28, 2011, 09:42
Добавь в свой класс настроек еще и кеширование.
Это создаст трудные (а может и неразрешимые) проблемы с "многопоточностью", т.к. Qt кэш не thread-safe

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

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


Название: Re: Доступ к централизованным данным
Отправлено: ecspertiza от Сентябрь 28, 2011, 10:26
Цитировать
Это создаст трудные (а может и неразрешимые) проблемы с "многопоточностью", т.к. Qt кэш не thread-safe

а мьютексы тут не помогут ?


Название: Re: Доступ к централизованным данным
Отправлено: Igors от Сентябрь 28, 2011, 10:51
а мьютексы тут не помогут ?
Да скорее навредят (если речь о QMutex)


Название: Re: Доступ к централизованным данным
Отправлено: ecspertiza от Сентябрь 28, 2011, 11:10
да, о них, не так часто с ними работал, решил уточнить. Вроде же была какая то возможность запретить доступ к переменной если ее уже кто то юзает.... совсем забыл