Как обрабатывать жизненный цикл динамически размещаемых данных в сообщениях Windows? - PullRequest
4 голосов
/ 16 июня 2010

Простая задача: отправить сообщение Windows с динамически распределяемыми данными, например, строка произвольной длины. Как бы вы справились с обязанностью освободить эти данные?

Получатель сообщения Windows может быть ответственным за освобождение этих данных. Но: Как вы можете гарантировать, что все сообщения будут фактически получены и, таким образом, связанные данные будут освобождены? Представьте себе ситуацию, когда получатель выключается, чтобы он больше не обрабатывал свою очередь сообщений. Однако очередь сообщений все еще существует (в течение некоторого времени) и может принимать сообщения, которые больше не будут обрабатываться.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

PostMessage возвращает BOOL, который сообщает вам, было ли сообщение отправлено или нет.Это обычно достаточно хорошо, потому что ваше окно должно быть действительным, пока оно не получит сообщения WM_DESTROY и WM_NCDESTROY.После вызова DestroyWindow (который отправляет эти сообщения) вы не сможете снова успешно вызвать PostMessage.

Теперь, если ваш PostMessage возвращает FALSE , вам придетсяубиратьЕсли этого не произойдет, процедура окна должна очистить.Не отправляйте сообщения, которые нужно очистить, в случайные окна, которые могут их не обрабатывать.На самом деле, не отправляйте любые WM_USER + x сообщения любым окнам, которые вы не обрабатываете.

1 голос
/ 01 февраля 2011

Здесь нечего делать.Как только вызов SendMessage вернется, вы можете освободить данные.Оказывается, другое приложение все равно не смотрит на вашу память, так как оно находится в другом процессе.Вместо этого Windows маршализирует данные через границу процесса.

Более того, если вы получаете данные в WndProc, вы не можете получить копию указателя на строку.Вместо этого вы должны взять копию содержимого строки, так как этот указатель действителен только в течение этого вызова WndProc.

Еще один момент, который следует отметить, - это путаница в очереди сообщений.Когда вы отправляете сообщение, это происходит синхронно, и очередь не участвует.В очереди сообщений размещаются опубликованных сообщений.Они обрабатываются асинхронно.

...