|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Все-таки ясности до конца нет: Например есть ресурс My.Resources.MYICON Мне нало передавать в API (напр. NOTIFYICONDATA) .Handle иконки Сделал вот так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Вопросы не дающие покоя: 1) lngIconTray в данном примере не сдохнет через какое-то время? (мусорщик) 2) Надо ли его удалять в конце? Т.е. делать Код: vbnet 1. 2.
3) Или правильнее делать так? Код: vbnet 1. 2. 3.
С одной стороны в описании к .Handle говорится Получает дескриптор Windows для данного объекта System.Drawing.Icon. Данный дескриптор не является копией дескриптора, поэтому освобождать его не следует. С другой стороны меня смущает что при многократном вызове .Handle (одной и той же иконки из ресурсов) генерируются разные значения этого Handle. Т.е. если я вызываю .Handle слишком часто (ну ДЛЯ КРАЙНЕГО ПРИМЕРА - захочу сделать мультипликацию трей-иконки и буду менять ее каждый раз вызывая MYICON.Handle), при этом не освобождаю ресурс то есть беспокойство что нарвусь. Как все-таки правильно в данном случае использовать MYICON.Handle? Запомнить handle один раз или брать его всякий раз? И надо ли что-то освобождать (дескриптор)? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 13:47 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Если этой свойство Handle, то в случае, если содержащий его класс не реализует интерфейс IDisposable, то удалять ничего не надо, если реализует - следует вызвать метод Dispose, но не освобождать дескриптор вне этого класса. Явное освобождение дескриптора требуется только в том случае, если создан он был тоже через P/invoke. Притом, в последнем случае его лучше обернуть в класс, реализующий интерфейс IDisposable и освобождать дескриптор в методе Dispose этого класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 13:55 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Ilya81, >освобождение дескриптора требуется ...в том случае, если создан он был тоже через P/invoke Это я понимаю. Также я понимаю что если я пишу New Icon , а потом беру от нее Handle то мне надо хранить эту Icon во внешней переменной, если я намерен использовать ее или ее Handle на протяжении всей работы программы. Давай посмотрим на верхний код и на мой вопрос: >1) lngIconTray в данном примере не сдохнет через какое-то время? (мусорщик) Не получается так что обращение My.Resources.MYICON создает новую Icon, которую мусорщик убьет из за чего сохраненный lngIconTray= My.Resources.MYICON.Handle станет недействительным и бесполезным по истечении времени? >2) Надо ли его удалять в конце? Т.е. делать Ну 99% уверен что все-таки не надо ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 14:10 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Дмитрий77... Ну 99% уверен что все-таки не надо Смотрим документацию . Класс Icon в пространстве имён System.Drawing реализует интерфейс IDisposable. Значит, нужно сохранить в поле класса не handle, а указатель на сам Icon, и перед удалением frm1 вызвать его метод Dispose. Дмитрий77... Не получается так что обращение My.Resources.MYICON создает новую Icon В этом случае, насколько помню, новый экземпляр не создастся, но если его где-то создавать, то нужно не забыть у старого вызвать метод Dispose. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 14:25 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Ilya81, >Значит, нужно сохранить в поле класса не handle, а указатель на сам Icon Оно так конечно, только в моем случае от этой Icon мне каждый раз придется все одно брать handle, а это меня малость смущает чет у меня котелок не варит Короче накатал такой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Т.е. взял один раз 2 handle от 2-х иконок из ресурсов и раз в секунду подсовываю эти handle и меняю иконку в трее. Жду пока хандлы сдохнут. За 20 минут не сдохли. Т.е. иконка в трее мигает(меняется). Если сдохнут, как минимум мигать перестанет. Сдохнут - буду думать, не сдохнут - оставлю свой код как есть (т.е. с единожды сохраненными хандлами и без DestroyIcon в конце). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 15:00 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Дмитрий77Оно так конечно, только в моем случае от этой Icon мне каждый раз придется все одно брать handle, а это меня малость смущает А что смущает? Handle типа данных IntPtr, который структура. Дмитрий77Жду пока хандлы сдохнут. За 20 минут не сдохли. Т.е. иконка в трее мигает(меняется). Если сдохнут, как минимум мигать перестанет. Так вызов метода Dispose есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 16:29 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Ilya81, >А что смущает? Handle типа данных IntPtr, который структура Смущает то что .Handle каждый раз выдает разные адреса (IntPtr) для одной и той же My.Resources.MYICON >Так вызов метода Dispose есть? Что имеешь ввиду? Я привел тестовый код целиком. Специально Dispose для иконки ресурса (или DestroyIcon для ее handle ) в конце работы я решил не делать - собственно это вроде как следует из документации и из твоих слов. Я на пару часов отходил от компа, хэндлы не сдохли. Поэтому думаю мусорщик здесь ничего не делает, оставлю код как есть (с запоминанием первоначальных именно хандлов). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 16:57 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Дмитрий77Я на пару часов отходил от компа, хэндлы не сдохли. это не означает отсутствия ошибок в говнокоде. Хэндл может сдохнуть, если ResourceManager решит перезагрузить ресурс, религия запрещает сохранить Icon? авторPerformance Considerations If you call the GetObject method multiple times with the same name parameter, do not depend on the method returning a reference to the same object with each call. This is because the GetObject method can return a reference to an existing resource object in a cache, or it can reload the resource and return a reference to a new resource object. https://msdn.microsoft.com/en-us/library/963f81yd(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 17:36 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
ИзопропилХэндл может сдохнуть, если ResourceManager решит перезагрузить ресурс, религия запрещает сохранить Icon? Хорошо, убедил. Так нормально? ДА? НЕТ? Что еще не так? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
Debug.Print(m_icon.Handle) показывает что .Handle данной иконки величина постоянная (как по логике и должно быть) - в отличии от случая прямого обращения к ресурсу, что меня и насторожило. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 18:31 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Дмитрий77, правдоподобно. Единственно, я бы в отдельный класс работу с треем ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 18:43 |
|
Использование иконок из Net ресурсов и освобождение объектов/хандлов
|
|||
---|---|---|---|
#18+
Изопропил, >правдоподобно. OK. Задолбаешься там с отдельным классом. У меня не примитивный функционал. Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon) Shell_NotifyIcon + Ballon(?) Tooltip Хочу понять логику "уведомлений в трей". ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 19:05 |
|
|
start [/forum/topic.php?fid=20&tid=1401956]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 362ms |
total: | 543ms |
0 / 0 |