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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование QSharedPointer  (Прочитано 5002 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Январь 23, 2014, 13:36 »

Добрый день

Решил попользоваться "умными указателями" (столь любимыми некоторыми). Вот вроде и случай представился, но что-то "не легло". Дело было так

Есть ресурс (для простоты QPixmap) принадлежащий окну. Есть класс (напр Client) который может запросить этот ресурс. Требуется

- окно в начале paintEvent создает pixmap и по окончании рисования удаляет. Любое число клиентов при запросе получают этот pixmap и не должны его удалять

- однако если мы не внутри paintEvent, то pixmap должна создаваться по запросу клиента и удаляться им же. При этом если еще клиенты запросили - ресурс жив пока все клиенты не отключатся.

Ясно что второй подходит под shared указатель идеально - но как связать это с первым?

Спасибо
Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #1 : Январь 24, 2014, 08:52 »

Не совсем понятно что требуется, но я так понял вам необходимо:
в первом случае создавать SharedPointer, раздавать WeakPointer, хранить у себя SharedPointer;
во втором случае создавать SharedPointer, раздавать SharedPointer, хранить у себя WeakPointer.
Записан
Akon
Гость
« Ответ #2 : Январь 24, 2014, 09:21 »

Ну а окно в паинтэвент не является таким же клиентом, как и внешние? Пиксмап созжается либо по внешнему запросу, либо с паинтэвента и шарится между всеми. Достаточно одного шаредпоинтера. Далее, если пикмап меняется, запрос выдает новый пиксмап, часть клиентов содержат старый, как только все запросят новый, старый автоматом освободится (не будет ссылок).

А QWeekPointer это как QPointer - пассивный наблюдатель.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 24, 2014, 10:37 »

Ну а окно в паинтэвент не является таким же клиентом, как и внешние? Пиксмап созжается либо по внешнему запросу, либо с паинтэвента и шарится между всеми. Достаточно одного шаредпоинтера. Далее, если пикмап меняется, запрос выдает новый пиксмап, часть клиентов содержат старый, как только все запросят новый, старый автоматом освободится (не будет ссылок).

А QWeekPointer это как QPointer - пассивный наблюдатель.
С точки зрения клиента все равно как/где создан ресурс, он его использует однообразно. Также ресурс модифицируется (не константа), но не может быть сменен на другой в течение всей жизни клиента. Отличается только удаление ресурса. Псевдокод для 1 клиента
Код
C++ (Qt)
// "посторонка" - вообще кто-то извне дал ресурс, клиент его только пользует
Client::Client( QPixmap & pm ) :
mResource(&pm),
mMode(mode_External)
{
}
 
// взять ресурс у окна или создать самому
Client::Client( QWidget * w, bool inPaintEvent ) :
mMode(inPaintEvent  ? mode_Paint : mode_Owner)
{
mResource = inPaintEvent ? GetResFromWidget(w) : CreateOwnRes();  
}
 
// освобождение ресурса
Client::~Client( void )
{
switch (mMode) {
  case mode_External:   // не мое дело, кто создал, тот и удаляет
    break;
 
 case mode_Paint:   // окно должно удалить
   break;
 
 case mode_Owner:
  delete mResource;   // я создал, я и удаляю
}
}
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Январь 24, 2014, 11:06 »

В качестве ремарки,
использовать для таких вещей QPixmap, имхо, довольно-таки затратно.
А в paintEvent() вообще нерационально, т.к. попахивает ущербным дизайном.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Январь 24, 2014, 12:18 »

В качестве ремарки,
использовать для таких вещей QPixmap, имхо, довольно-таки затратно.
А в paintEvent() вообще нерационально, т.к. попахивает ущербным дизайном.
В оригинале ресурс = QPainter  Улыбающийся пиксмап просто для примера, чтобы "не углубляться"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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