![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка сообщений от другого приложения [D5, NT4, Win2k, WinXP]
ai © (2003-05-16 11:38:00)После отправки сообщения другому приложению (SendMessage), посылающее ждет, пока в принимающем не выполнится метод-обработчик этого сообщения. А обработчик - длительная процедура. Как показать посылающему приложению, что его сообщение принято и будет потом обработано, чтобы посылающее приложение не подвисало до конца выполнения метода-обработчика?
Digitman (2003-05-16 16:10:00) [1]
> Игорь Шевченко
конечно)
Игорь Шевченко (2003-05-16 15:54:00) [2]Digitman © (16.05.03 15:08)
Да вроде нет противоречия - сообщения, поставленные в очередь исчезают вместе с очередью. Для тех системных сообщений, логика которых предусматривает выделенные системой ресурсы (например, WM_SET(GET)TEXT) эти ресурсы освобождаются вместе с сообщениями. А указатели в пользовательских сообщениях, разумеется не освобождаются :)
Digitman (2003-05-16 15:38:00) [3]
> AlexRush
Ну, возможно, я не совсем правильно определил твою мысль)
AlexRush (2003-05-16 15:15:00) [4]Digitman >> А я и не говорил о том, что возврат TRUE PostMessage гарантирует обработку сообщения, оно гарантирует лишь доставку.
ai >> В таком случае, обработчик этого собщения должен первым делом тем или иным способом сигнализированть о приеме сообщения, а потом выполнять прикладную работу. (о чем собственно тут и говорится)
Digitman (2003-05-16 15:08:00) [5]
> Игорь Шевченко
Ну так ты, Игорь, здесь сам себе противоречишь)
"Бесследно", но - с условием)...
Я-то как раз - о ресурсах памяти. Система вовсе, как ты понимаешь, не обязана заботиться о потенц.мемликах, которые имеют отношение к какому-то там менеджеру памяти... до тех, разумеется, пор, пока не ExitProcess()
Игорь Шевченко (2003-05-16 15:00:00) [6]
> Кстати, бесследно ли ? При такой ситуации и мемлики не исключены
> ! Ибо при межпоточной передаче сообщения в контексте одного
> и того же процесса параметром в этом сообщении вполне мог
> бы быть и указатель на блок памяти, аллокированный в потоке-
> источнике, и по непродуманной (!) логике ожидавший деаллокации
> в обработчике сообщения в потоке-приемнике.
Бесследно. Для системных сообщений, предусматривающих межпоточную (и межпроцессную тоже) коммуникацию, освобождение ресурсов вызовется при ExitThread, для пользовательских - нет. А по непродуманной логике много чего может случиться :)
Digitman (2003-05-16 14:48:00) [7]
> AlexRush
> Если она вернет <>0 то "его сообщение принято и будет потом
> обработано.
Вовсе не факт. Представь себе ситуацию, когда PostMessage() (равно, кстати, как и PostThreadMessage) вернул True. На этом вызывающий код.поток успокоился, пребывая в наивной уверенности, что его сообщение было принято системой, поставлено в очередь сообщений целевого потока/окна и рано или поздно будет выбрано целевым код.потоком из очереди и обработано.
Но ! Целевой кодовый поток, занятый в этот момент, скажем, обработкой предыдущих сообщений, может неожиданно завершить свое выполнение ! Например. по исключению, возникшему в ходе обработки некоего предыдыщего сообщения. И как только целевой код.поток выполнит ExitThread(), то все существовавшие очереди сообщений, ассоциированные с ним, будут (так или иначе) уничтожены системой, а , значит, и сообщение, посланное по Post(Thread)Message и ждавшее своего часа "Х" для обработки, исчезнет бесследно.
Кстати, бесследно ли ? При такой ситуации и мемлики не исключены ! Ибо при межпоточной передаче сообщения в контексте одного и того же процесса параметром в этом сообщении вполне мог бы быть и указатель на блок памяти, аллокированный в потоке- источнике, и по непродуманной (!) логике ожидавший деаллокации в обработчике сообщения в потоке-приемнике.
Вот такие вот пироги)
ai (2003-05-16 14:25:00) [8]этот вариант в моем случае устраивает.
Спасибо за помощь!
Digitman (2003-05-16 13:45:00) [9]единственное важное замечание - передатчик сообщения должен работать в другом кодовом потоке, нежели приемник сообщения. В противном случае ReplyMessage() ничего не делает.
Digitman (2003-05-16 13:38:00) [10]в любом месте метода-обработчика сообщения вызываешь ReplyMessage() c параметром, значение которого будет результатом вызова ф-ции SendMessage(), вызванной на стороне источника сообщения
когда система после исполнения ReplyMessage() вернет управл-е методу-обработчику (обработка еще не завершена по сути и может продолжаться дальше), то в этот момент ф-ция SendMessage() тоже вернет управление вызвавшему ее коду
ai (2003-05-16 13:32:00) [11]>Digitman
Если я правильно понял, ReplyMessage нужно вызвать сразу после распознавания сообщения в медоде-обработчике?
А что за результат LResilt?
Digitman (2003-05-16 12:10:00) [12]на то есть ReplyMessage(lResult)
этой ф-ция разблокирует поток-отправитель сообщения, т.е. вызванная им ф-ция SendMessage() немедленно возвращает управление, как и положено - с возвратом результата, lResult
ai (2003-05-16 12:00:00) [13]спасибо
AlexRush (2003-05-16 11:42:00) [14]используй PostMessage. Она посылает сообщение и тут же возвращает результат, на дожидаясь его обработки. Если она вернет <>0 то "его сообщение принято и будет потом обработано".