Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Апрель 25, 2012, 14:13



Название: Статистика shared
Отправлено: Igors от Апрель 25, 2012, 14:13
Добрый день

Меня вполне устраивает любое shared (хоть implicit), но нередко я не хочу или не могу пускать дело на самотек, надеясь что объект когда-нибудь да удалится. Нужно/хотелось бы иметь ф-цию печатающую статистику, примерно так
Цитировать
MyClass objects 10   // всего сейчвс 10 экземпляров MyClass

[ 0 ] "Image1.png", 4 referenced (0xabcd1234, 0xabcd1238...)
...
[ 9 ] "ImageXXX.png", 1 referenced (0xabcd1234)
Т.е. по каждому экземпляру - кол-во ссылающихся и их адреса. Ну + какая-то информация об экземпляре (напр имя имеджа)

Как это сделать? Помогут ли "умные указатели" - или они не так уж умны?  :)

Спасибо


Название: Re: Статистика shared
Отправлено: Akon от Апрель 25, 2012, 14:57
Т.е. нужно добраться до счетчика ссылок, а-ля boost::shared_ptr<T>::use_count()?
Нужно посмотреть сорцы кьютейных классов - может быть имеется какой-нибудь паблик доступ.


Название: Re: Статистика shared
Отправлено: Igors от Апрель 25, 2012, 18:08
Т.е. нужно добраться до счетчика ссылок, а-ля boost::shared_ptr<T>::use_count()?
Нужно посмотреть сорцы кьютейных классов - может быть имеется какой-нибудь паблик доступ.
Отсутствует, не вижу даже как получить счетчик ссылок. Не говоря уже о том что его недостаточно, надо знать ссылающихся (кто держит).

Конечно средствами языка это сделать не так уж сложно, но как же так: и то хорошее, и это мощное - а чуть более сложная задача - и что, "даешь велосипед"?  Получается что расширяемость всех тех прибамбасов нулевая? Как-то не по-хозяйски  :'(


Название: Re: Статистика shared
Отправлено: navrocky от Апрель 25, 2012, 23:33
Ссылающихся ты точно не получишь, а счетчик можно вытянуть при желании. Для тебя единственный подходящий вариант - пропатчить Qt под свои нужды.


Название: Re: Статистика shared
Отправлено: Igors от Апрель 26, 2012, 10:31
Ссылающихся ты точно не получишь, а счетчик можно вытянуть при желании. Для тебя единственный подходящий вариант - пропатчить Qt под свои нужды.
А как Вы себе это представляете? В смысле как в итоге должен выглядеть пропатченый класс(ы) (и какие?) чтобы я мог получить ссылающихся?


Название: Re: Статистика shared
Отправлено: Akon от Апрель 26, 2012, 13:03
Малоинвазивное решение: добавьте в счетчик коллбеки с необходимой информацией на attach/detach. На этом патчинг Qt закончен. Далее в коллбеках (пользовательский код) делайте, что угодно, в частности, ведите учет клиентов шареных данных.


Название: Re: Статистика shared
Отправлено: Igors от Апрель 27, 2012, 16:57
Малоинвазивное решение: добавьте в счетчик коллбеки с необходимой информацией на attach/detach. На этом патчинг Qt закончен. Далее в коллбеках (пользовательский код) делайте, что угодно, в частности, ведите учет клиентов шареных данных.
Конечно хотелось бы использовать уже имеющиеся классы, но это не самоцель. Я бы хотел крутить примерно так (псевдокод)
Код
C++ (Qt)
CSharedResource <QImage> theResource(new QImage(), this);   // новый ресурс. пока 1 user (this)
..
theResource.Attach2User(this);  // еще 1 user
theResource.DetachFromUser(this);  // user освободил
..
theResource.ContentChanged();  // имедж изменился, ссылающиеся должны это учесть (напр перерисовать UI)
..
theResource.Release();  // имедж будет удален, сообщаем ссылающимся
..
theResource.Hand2Hand(oldUser. newUser);  
theResource.CanBeReleased();  // и.т.д.
 
Т.е. не просто мельтешить с тем shared (в целях обучения программированию) а по делу


Название: Re: Статистика shared
Отправлено: navrocky от Апрель 27, 2012, 17:10
Т.е. поиск подвисших кутэшных шаренных объектов в существующем коде не ваша цель?

Тогда что вам мешает сделать такую обвертку?


Название: Re: Статистика shared
Отправлено: Igors от Апрель 27, 2012, 17:32
Т.е. поиск подвисших кутэшных шаренных объектов в существующем коде не ваша цель?
Пока не вижу как использовать "кутэшные шаренные" - необходимость что-то патчить уже достаточно неприятна, да и решается лишь одна, частная задача

Тогда что вам мешает сделать такую обвертку?
Ничто, просто хочу посоветоваться с людями  :)