Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-55908
odyssey
2003-05-14 15:47
2003.07.17
минимизация


14-55756
Sheng
2003-07-02 20:37
2003.07.17
Кто чем пользуется?


1-55498
Alexey
2003-07-04 09:46
2003.07.17
Отключение звукового сигнала при Showmessage


3-55443
stone
2003-06-24 13:41
2003.07.17
Как програмно создать поле Float?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский