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