Название: Использование QSharedPointer Отправлено: Igors от Январь 23, 2014, 13:36 Добрый день
Решил попользоваться "умными указателями" (столь любимыми некоторыми). Вот вроде и случай представился, но что-то "не легло". Дело было так Есть ресурс (для простоты QPixmap) принадлежащий окну. Есть класс (напр Client) который может запросить этот ресурс. Требуется - окно в начале paintEvent создает pixmap и по окончании рисования удаляет. Любое число клиентов при запросе получают этот pixmap и не должны его удалять - однако если мы не внутри paintEvent, то pixmap должна создаваться по запросу клиента и удаляться им же. При этом если еще клиенты запросили - ресурс жив пока все клиенты не отключатся. Ясно что второй подходит под shared указатель идеально - но как связать это с первым? Спасибо Название: Re: Использование QSharedPointer Отправлено: Johnik от Январь 24, 2014, 08:52 Не совсем понятно что требуется, но я так понял вам необходимо:
в первом случае создавать SharedPointer, раздавать WeakPointer, хранить у себя SharedPointer; во втором случае создавать SharedPointer, раздавать SharedPointer, хранить у себя WeakPointer. Название: Re: Использование QSharedPointer Отправлено: Akon от Январь 24, 2014, 09:21 Ну а окно в паинтэвент не является таким же клиентом, как и внешние? Пиксмап созжается либо по внешнему запросу, либо с паинтэвента и шарится между всеми. Достаточно одного шаредпоинтера. Далее, если пикмап меняется, запрос выдает новый пиксмап, часть клиентов содержат старый, как только все запросят новый, старый автоматом освободится (не будет ссылок).
А QWeekPointer это как QPointer - пассивный наблюдатель. Название: Re: Использование QSharedPointer Отправлено: Igors от Январь 24, 2014, 10:37 Ну а окно в паинтэвент не является таким же клиентом, как и внешние? Пиксмап созжается либо по внешнему запросу, либо с паинтэвента и шарится между всеми. Достаточно одного шаредпоинтера. Далее, если пикмап меняется, запрос выдает новый пиксмап, часть клиентов содержат старый, как только все запросят новый, старый автоматом освободится (не будет ссылок). С точки зрения клиента все равно как/где создан ресурс, он его использует однообразно. Также ресурс модифицируется (не константа), но не может быть сменен на другой в течение всей жизни клиента. Отличается только удаление ресурса. Псевдокод для 1 клиентаА QWeekPointer это как QPointer - пассивный наблюдатель. Код
Название: Re: Использование QSharedPointer Отправлено: GreatSnake от Январь 24, 2014, 11:06 В качестве ремарки,
использовать для таких вещей QPixmap, имхо, довольно-таки затратно. А в paintEvent() вообще нерационально, т.к. попахивает ущербным дизайном. Название: Re: Использование QSharedPointer Отправлено: Igors от Январь 24, 2014, 12:18 В качестве ремарки, В оригинале ресурс = QPainter :) пиксмап просто для примера, чтобы "не углубляться" использовать для таких вещей QPixmap, имхо, довольно-таки затратно. А в paintEvent() вообще нерационально, т.к. попахивает ущербным дизайном. |