Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

Обработка сообщений от другого приложения   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
14-55734
Knight
2003-06-30 11:55
2003.07.17
Веб-дизайн


1-55500
DBDev
2003-07-02 17:37
2003.07.17
Коллеги, чем бы занять юзера на время окрытия базы???


6-55688
velsi
2003-05-13 11:13
2003.07.17
idFTPserver


1-55528
Mishenka
2003-07-02 23:46
2003.07.17
Где у Application указывать события?


3-55412
Evgenij Kardash
2003-06-22 19:18
2003.07.17
Запрос по двум таблицам