Russian Qt Forum

Qt => Общие вопросы => Тема начата: QCasper от Сентябрь 11, 2006, 12:02



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


Название: Implicitly shared classes (detach)
Отправлено: Sergeich от Сентябрь 11, 2006, 14:28
Во-первых какая версия?
Если речь идет о тройке, то для detach в многопоточных приложениях используется QDeepCopy<T>
В 4-ке detach сделали thread-safe, так что никаких лишних движений делать не надо.


Название: Implicitly shared classes (detach)
Отправлено: QCasper от Сентябрь 11, 2006, 15:24
Цитата: "Sergeich"
Во-первых какая версия?
Если речь идет о тройке, то для detach в многопоточных приложениях используется QDeepCopy<T>
В 4-ке detach сделали thread-safe, так что никаких лишних движений делать не надо.


4я версия. Я не знаю чего они там сделали. Но у меня в ряде случаев происходит потеря данных, приходится делать не просто лишние движения, а очень лишние. Как например отказаться от использования QIcon в пользу QPixmap, т.к. у второго есть detach.


Название: Implicitly shared classes (detach)
Отправлено: Sergeich от Сентябрь 11, 2006, 18:54
А можно вообще поподробнее.
Че за ОС, че за приложение, в каких случаях валиться?


Название: Implicitly shared classes (detach)
Отправлено: QCasper от Сентябрь 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.