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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Implicitly shared classes (detach)  (Прочитано 3758 раз)
QCasper
Гость
« : Сентябрь 11, 2006, 12:02 »

Все знают, что некоторые классы во всеми любимой библиотеке являются iplicitly shared. Меня интересует как детачить объекты этих классов от шаред дата, если например у класса нет явного метода для этого, как например QPixmap::detach(). Что например делать скажем с QMap.
В ассистанте написано, что оно детачится само когда
Цитировать
the object is about to change and the reference count is greater than one
но иногда бывают такие моменты когда мне НЕ надо менять обжект, а референс каунт по какой-то причине не больше единицы. Вобщем происходит потеря данных со всеми вытекающими аксесс виолэйшн.
Как детачить?
Записан
Sergeich
Гость
« Ответ #1 : Сентябрь 11, 2006, 14:28 »

Во-первых какая версия?
Если речь идет о тройке, то для detach в многопоточных приложениях используется QDeepCopy<T>
В 4-ке detach сделали thread-safe, так что никаких лишних движений делать не надо.
Записан
QCasper
Гость
« Ответ #2 : Сентябрь 11, 2006, 15:24 »

Цитата: "Sergeich"
Во-первых какая версия?
Если речь идет о тройке, то для detach в многопоточных приложениях используется QDeepCopy<T>
В 4-ке detach сделали thread-safe, так что никаких лишних движений делать не надо.


4я версия. Я не знаю чего они там сделали. Но у меня в ряде случаев происходит потеря данных, приходится делать не просто лишние движения, а очень лишние. Как например отказаться от использования QIcon в пользу QPixmap, т.к. у второго есть detach.
Записан
Sergeich
Гость
« Ответ #3 : Сентябрь 11, 2006, 18:54 »

А можно вообще поподробнее.
Че за ОС, че за приложение, в каких случаях валиться?
Записан
QCasper
Гость
« Ответ #4 : Сентябрь 11, 2006, 21:34 »

Цитата: "Sergeich"
А можно вообще поподробнее.
Че за ОС, че за приложение, в каких случаях валиться?


Один из примеров. Дллка экспортирует фукцию, которая возвращает QIcon. Я загружаю дллку, пишу

Код:
ICON icon = lib->resolve("Icon");
m_Icons << icon();
// где QList<QIcon> m_Icons;
// и typedef QIcon (*ICON)();


и тут же выгружаю дллку. Так вот иконки нет нифига в списке.
Иконку можно будет увидеть, только если еще раз загрузить дллку.
Вот в этом месте я как раз заменил QIcon на QPixmap, т.к. не нашел нормального способа детачить.
Приложение конечно здесь не валилось, но тем не менее потеря данных на лицо.
Да, OS Windows.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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