IntPtr, SafeHandle и HandleRef - Объяснено

revalidate вызывается в контейнере после добавления новых компонентов или удаления старых. этот вызов является инструкцией, чтобы сообщить диспетчеру макета сбросить его на основе нового списка компонентов. revalidate вызовет вызов, чтобы перекрасить то, что компонент считает «грязными регионами». Очевидно, что не все области на вашем JPanel считаются грязными RepaintManager.

repaint используется, чтобы сообщить компоненту перекрасить себя. Часто бывает так, что вам нужно позвонить этому, чтобы очистить условия, такие как ваши.

37
задан Milan Gardian 16 June 2009 в 13:27
поделиться

2 ответа

IntPtr просто простая основанная на целом числе структура, которая может содержать указатель (т.е., 32 диаметра долота в 32-разрядных системах, 64-разрядном размере в 64-разрядных системах).

SafeHandle класс, который предназначается для содержания дескрипторов объекта Win32 - он имеет финализатор, который удостоверяется, что дескриптор закрывается, когда объект является GC'ed. SafeHandle абстрактный класс, потому что различные дескрипторы Win32 имеют различные способы, которыми они должны быть закрыты. До введения SafeHandle, IntPtr использовался для содержания дескрипторов Win32, но гарантирование, что их правильно закрыли и препятствовали быть GC'ed, было ответственностью программиста.

HandleRef способ удостовериться, что неуправляемый дескриптор не является GC'ed, когда Вы посреди вызова P/Invoke. Без чего-то как HandleRef, если Ваш управляемый код ничего не делает с дескриптором после вызова P/Invoke, если бы GC был выполнен во время вызова P/Invoke, он не понял бы, что дескриптор все еще использовался, и мог бы GC он. Я воображаю (но я не уверен и не посмотрел), что SafeHandle мог бы использовать HandleRef в качестве части его управления инкапсулированным дескриптором.

50
ответ дан Michael Burr 17 June 2009 в 00:27
поделиться
HWnd a = new HWnd();
B.SendMessage(a.Handle, ...);

Предполагая, что это единственная ссылка на «a» в программе, это эквивалентно:

HWnd a = new HWnd();
IntPtr h = a.Handle;
// a is no longer needed and thus can be GC'ed
B.SendMessage(h, ...);

Проблема в том, что когда «a» удаляется, он закрывает дескриптор. Если это произойдет до или во время вызова SendMessage, дескриптор будет недействительным.

HandleRef предотвращает сборку мусора "a" до того, как программа завершит работу с h.

18
ответ дан 27 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: