Что является временем жизни CWnd, полученного из CWnd:: FromHandle?

БОЛЬШОЙ акцент на первую точку, что Jon отправляется. Более неизменное состояние, которое Вы имеете (т.е.: globals, которые являются константой, и т.д....), более легкое Ваша жизнь будет (т.е.: чем меньше блокировок Вы будете иметь для контакта с, тем меньше обоснования Вы будете иметь, чтобы сделать о чередующемся порядке, и т.д....)

кроме того, часто времена, если у Вас есть маленькие объекты, к которым Вам нужны несколько потоков, чтобы иметь доступ, Вы иногда - более обеспеченное копирование его между потоками вместо того, чтобы иметь общее, изменяемое, глобальное, который Вы имеете для содержания блокировки для читения/видоизменения. Это - компромисс между Вашей эффективностью исправности и памяти.

12
задан remio 1 October 2009 в 15:05
поделиться

4 ответа

MFC поддерживает ряд карт дескрипторов, от HWND до CWnd, от HDC до CDC и т. Д., Которые хранятся в состоянии потока. Каждая карта дескрипторов содержит постоянную карту и временную карту - постоянные записи добавляются, когда вы вызываете такой метод, как CWnd :: Create или CDC :: Attach, а временные записи создаются, когда вы вызываете FromHandle для дескриптора, который не имеет постоянная запись.

Временные записи очищаются во время обработки в режиме ожидания (в CWinApp :: OnIdle), поэтому их можно безопасно использовать только при обработке текущего сообщения. Как только вы вернетесь в цикл сообщений или войдете в другой модальный цикл (например, вызвав DoModal), они могут быть удалены.

15
ответ дан 2 December 2019 в 20:18
поделиться

FromHandle в основном используется для получения временной ссылки на уже существующий объект окна. MFC хранит эти ссылки во внутренней структуре, называемой временной картой дескрипторов (карта дескрипторов - это карта Windows HWND с объектами MFC CWnd, используемыми MFC для выполнения вызовов Win32 для управления фактическим окном Windows, которому соответствует объект MFC). Чтобы количество объектов в этой структуре не увеличивалось за все границы, элементы удаляются из карты дескрипторов во время обработки цикла ожидания MFC.

Как вы, возможно, догадались, существует также постоянная карта дескрипторов, которая не будет иметь это поведение автоматической очистки. Если вам нужно получить объект CWnd, который не помещает свою ссылку HWND во временную карту дескрипторов, вы можете вызвать FromHandlePermanent ().

-Ron

1
ответ дан 2 December 2019 в 20:18
поделиться

На основе то же описание MSDN, я бы предположил, что это означает, что если CWnd не прикреплен к hWnd, предоставленному в качестве объекта, он создаст временный CWnd, который, вероятно, будет уничтожен, когда что-то выходит за пределы области действия, или вызывается деструктор в другом месте, или CWnd явно создается для рассматриваемого hWnd.Так что, если у вас уже есть созданный CWnd, все должно быть в порядке, иначе вам, вероятно, придется быть очень осторожным с сохранением полученного указателя.

0
ответ дан 2 December 2019 в 20:18
поделиться

Обычно они хотят, чтобы вы использовали этот дескриптор только в рамках вашей функции. И не хранить его как поле класса, где вы будете ссылаться на него на протяжении всей жизни вашего объекта.

0
ответ дан 2 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

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