powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование иконок из Net ресурсов и освобождение объектов/хандлов
12 сообщений из 12, страница 1 из 1
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870363
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все-таки ясности до конца нет:

Например есть ресурс
My.Resources.MYICON
Мне нало передавать в API (напр. NOTIFYICONDATA) .Handle иконки

Сделал вот так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Class frm1

  Dim lngIconTray As IntPtr

 Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
    lngIconTray= My.Resources.MYICON.Handle
...
'Из кода (в процессе работы приложения -возможно через какое-то длительное время):
    Dim nid As New NOTIFYICONDATA
    With nid
      .hIcon = lngIconTray
...
  Shell_NotifyIcon(...



Вопросы не дающие покоя:
1) lngIconTray в данном примере не сдохнет через какое-то время? (мусорщик)
2) Надо ли его удалять в конце? Т.е. делать
Код: vbnet
1.
2.
  Private Sub frm1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
  DestroyIcon (lngIconTray)


3) Или правильнее делать так?
Код: vbnet
1.
2.
3.
    Dim nid As New NOTIFYICONDATA
    With nid
      .hIcon = My.Resources.MYICON.Handle



С одной стороны в описании к .Handle говорится
Получает дескриптор Windows для данного объекта System.Drawing.Icon. Данный дескриптор не является копией дескриптора, поэтому освобождать его не следует.

С другой стороны меня смущает что при многократном вызове .Handle (одной и той же иконки из ресурсов) генерируются разные значения этого Handle. Т.е. если я вызываю .Handle слишком часто (ну ДЛЯ КРАЙНЕГО ПРИМЕРА - захочу сделать мультипликацию трей-иконки и буду менять ее каждый раз вызывая MYICON.Handle), при этом не освобождаю ресурс то есть беспокойство что нарвусь.

Как все-таки правильно в данном случае использовать MYICON.Handle?
Запомнить handle один раз или брать его всякий раз? И надо ли что-то освобождать (дескриптор)?
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870374
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если этой свойство Handle, то в случае, если содержащий его класс не реализует интерфейс IDisposable, то удалять ничего не надо, если реализует - следует вызвать метод Dispose, но не освобождать дескриптор вне этого класса.

Явное освобождение дескриптора требуется только в том случае, если создан он был тоже через P/invoke. Притом, в последнем случае его лучше обернуть в класс, реализующий интерфейс IDisposable и освобождать дескриптор в методе Dispose этого класса.
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870389
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,

>освобождение дескриптора требуется ...в том случае, если создан он был тоже через P/invoke
Это я понимаю.

Также я понимаю что если я пишу New Icon , а потом беру от нее Handle то мне надо хранить эту Icon во внешней переменной, если я намерен использовать ее или ее Handle на протяжении всей работы программы.

Давай посмотрим на верхний код и на мой вопрос:
>1) lngIconTray в данном примере не сдохнет через какое-то время? (мусорщик)

Не получается так что обращение My.Resources.MYICON создает новую Icon, которую мусорщик убьет из за чего сохраненный
lngIconTray= My.Resources.MYICON.Handle станет недействительным и бесполезным по истечении времени?

>2) Надо ли его удалять в конце? Т.е. делать
Ну 99% уверен что все-таки не надо
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870405
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77...
Ну 99% уверен что все-таки не надо
Смотрим документацию . Класс Icon в пространстве имён System.Drawing реализует интерфейс IDisposable. Значит, нужно сохранить в поле класса не handle, а указатель на сам Icon, и перед удалением frm1 вызвать его метод Dispose.
Дмитрий77...
Не получается так что обращение My.Resources.MYICON создает новую Icon
В этом случае, насколько помню, новый экземпляр не создастся, но если его где-то создавать, то нужно не забыть у старого вызвать метод Dispose.
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870456
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Public Class frm1

  Public lngIconTray As IntPtr
  Public lngIconTray_Start As IntPtr
  Public lngIconTray_Stop As IntPtr

 Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
     lngIconTray_Start = My.Resources.ICONSTART.Handle
    lngIconTray_Stop = My.Resources.ICONSTOP.Handle
    lngIconTray = lngIconTray_Stop

  Private Sub ChangeTrayIcon()
    'код вывода иконки в трей
    Dim nid As NOTIFYICONDATA
    With nid
      .cbSize = IIf(sys_WinVista, Marshal.SizeOf(nid), Marshal.SizeOf(nid) - IntPtr.Size)' Len(nid)/NOTIFYICONDATA_V3_SIZE
      .hWnd = Me.Handle
      .uID = vbNull
      .uFlags = NIF_ICON
      .hIcon = lngIconTray
    End With
    Shell_NotifyIcon(NIM_MODIFY, nid) 'меняем иконку в трее
  End Sub

  'test (1000мс-меняем)
   Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    If (lngIconTray = lngIconTray_Stop) Then
      lngIconTray = lngIconTray_Start
    Else
      lngIconTray = lngIconTray_Stop
    End If
    ChangeTrayIcon()
  End Sub



Т.е. взял один раз 2 handle от 2-х иконок из ресурсов и раз в секунду подсовываю эти handle и меняю иконку в трее.
Жду пока хандлы сдохнут.
За 20 минут не сдохли. Т.е. иконка в трее мигает(меняется). Если сдохнут, как минимум мигать перестанет.
Сдохнут - буду думать, не сдохнут - оставлю свой код как есть (т.е. с единожды сохраненными хандлами и без DestroyIcon в конце).
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870587
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Оно так конечно, только в моем случае от этой Icon мне каждый раз придется все одно брать handle, а это меня малость смущает

А что смущает? Handle типа данных IntPtr, который структура.
Дмитрий77Жду пока хандлы сдохнут.
За 20 минут не сдохли. Т.е. иконка в трее мигает(меняется). Если сдохнут, как минимум мигать перестанет.

Так вызов метода Dispose есть?
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870615
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,

>А что смущает? Handle типа данных IntPtr, который структура
Смущает то что .Handle каждый раз выдает разные адреса (IntPtr) для одной и той же My.Resources.MYICON

>Так вызов метода Dispose есть?
Что имеешь ввиду? Я привел тестовый код целиком. Специально Dispose для иконки ресурса (или DestroyIcon для ее handle ) в конце работы я решил не делать - собственно это вроде как следует из документации и из твоих слов.

Я на пару часов отходил от компа, хэндлы не сдохли. Поэтому думаю мусорщик здесь ничего не делает, оставлю код как есть (с запоминанием первоначальных именно хандлов).
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870659
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий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
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870710
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилХэндл может сдохнуть, если 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.
Public Class frm1

  Dim IconTray_Start As Icon
  Dim IconTray_Stop As Icon
  Dim bTest As Boolean

  Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
    '----------------------------------------
    IconTray_Start = My.Resources.ICONSTART
    IconTray_Stop = My.Resources.ICONSTOP
    '----------------------------------------
    InitTrayIcon() 'вывод иконки в трей с установкой версии 4
    '----------------------------------------
  End Sub

  Private Sub frm1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    'this removes the icon from the system tray
    Dim nid As New NOTIFYICONDATA
    With nid
      .cbSize = IIf(sys_WinVista, Marshal.SizeOf(nid), Marshal.SizeOf(nid) - IntPtr.Size) 'NOTIFYICONDATA_V3_SIZE для XP
      .hWnd = Me.Handle
      .uID = vbNull
    End With
    Shell_NotifyIcon(NIM_DELETE, nid)

    IconTray_Start.Dispose()
    IconTray_Stop.Dispose()
  End Sub

  Private Sub ChangeTrayIcon(ByVal m_icon As Icon)
    'код вывода иконки в трей
    Dim nid As New NOTIFYICONDATA
    With nid
      .cbSize = IIf(sys_WinVista, Marshal.SizeOf(nid), Marshal.SizeOf(nid) - IntPtr.Size) 'NOTIFYICONDATA_V3_SIZE для XP
      .hWnd = Me.Handle
      .uID = vbNull
      .uFlags = NIF_ICON
      .hIcon = m_icon.Handle
      Debug.Print(m_icon.Handle)
    End With
    Shell_NotifyIcon(NIM_MODIFY, nid) 'меняем иконку в трее
  End Sub

'тест раз в секунду
  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    bTest = Not bTest
    If bTest Then
      ChangeTrayIcon(IconTray_Stop)
    Else
      ChangeTrayIcon(IconTray_Start)
    End If
  End Sub



Debug.Print(m_icon.Handle) показывает что .Handle данной иконки величина постоянная (как по логике и должно быть) - в отличии от случая прямого обращения к ресурсу, что меня и насторожило.
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870722
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

правдоподобно. Единственно, я бы в отдельный класс работу с треем
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870738
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

>правдоподобно.
OK.

Задолбаешься там с отдельным классом. У меня не примитивный функционал.

Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)

Shell_NotifyIcon + Ballon(?) Tooltip

Хочу понять логику "уведомлений в трей".
...
Рейтинг: 0 / 0
Использование иконок из Net ресурсов и освобождение объектов/хандлов
    #38870747
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Задолбаешься там с отдельным классом.
есть хороший базовый класс NativeWindow
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование иконок из Net ресурсов и освобождение объектов/хандлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]