Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вот есть PostMessage и SendMessage


Страницы:   1 2

tippa ©   (2010-04-03 16:23:00) 

Вот есть PostMessage и SendMessage.
Правильно ли я мыслю?->

Первое ставит сообщение в очередь и код идет выполняться дальше, то есть
PostMessage(H,BM_CLICK,0,0);
//дальнейший код

Здесь "//дальнейший код" может быть выполнен до того, как нажмется кнопка. Если я хочу чтобы "//дальнейший код" выполнялся только после нажатия кнопки, я должен после PostMessage вставить Application.ProcessMesseges;
PostMessage(H,BM_CLICK,0,0);
Application.ProcessMesseges;
//дальнейший код


Функция SendMessage шлет сообщение сразу, то есть
SendMessage(H,BM_CLICK,0,0);
//дальнейший код

здесь "//дальнейший код" не начнет выполнятся пока не нажмется клаваша.

Получается что код
PostMessage(H,BM_CLICK,0,0);
Application.ProcessMesseges;

эквивалентен коду
SendMessage(H,BM_CLICK,0,0);

верно?


Leonid Troyanovsky   (2010-04-04 09:23:00) [21]


> tippa ©   (03.04.10 16:23)  

> Получается что код
> PostMessage(H,BM_CLICK,0,0);
> Application.ProcessMesseges;
> эквивалентен коду
> SendMessage(H,BM_CLICK,0,0);

Попытаюсь составить краткое резюме:

Выполнение первого варианта зависит от текущего состояния
очереди асинхронных сообщений.
Например, после  ProcessMessages может оказаться, что h уже
невалиден, бо и кнопки никакой нет.

SendMessage ставит сообщение в очередь синхронных сообщений,
позволяющих делать описанное в статье по ссылке [3],
в отличии, скажем Perform, напрямую зовущей оконную процедуру.

И еще.
Для однопоточного приложения нужда в посланиях собственным окнам весьма экзотична и в части синхронных вызовов покрывается
использованием Perform, а для асинхронных вызовов - требует
внимательного изучения и аккуратной реализации.

--
Regards, LVT.


Leonid Troyanovsky   (2010-04-04 07:23:00) [22]


> Германн ©   (04.04.10 02:19) [9]

> посланного через SendMessage будет выполнена сразу, даже
> если в очереди сообщений сему окну на сей момент уже есть
> другие сообщения.

У синхронных сообщений своя очередь.

--
Regards, LVT.


Германн   (2010-04-04 02:19:00) [23]


> Игорь Шевченко ©   (03.04.10 19:39) [5]
>
> DVM ©   (03.04.10 19:38) [4]
>
> Мое "Нет" относится к тому, что код неэквивалентен. И он
> действительно неэквивалентен :)
>

Именно так. И прежде всего потому, что обработка сообщения посланного через SendMessage будет выполнена сразу, даже если в очереди сообщений сему окну на сей момент уже есть другие сообщения. Т.е. влезет первым в очередь как VIP-клиент. А PostMessage просто встанет в очередь как добропослушный гражданин Виндовс.


DVM   (2010-04-03 20:07:00) [24]


> Дальнейший код не будет выполняться, пока не вернется вызов
> оконной процедуры

Скорее всего он это и имел в виду просто так не совсем аккуратно написал. По крайней мере я понял как про возврат функции. О кнопке даже и не думал.


Игорь Шевченко   (2010-04-03 19:56:00) [25]


> Правильно ли я мыслю?->


> здесь "//дальнейший код" не начнет выполнятся пока не нажмется
> клаваша.


Дальнейший код не будет выполняться, пока не вернется вызов оконной процедуры, а нажмется ли при этом клавиша - а фиг его знает.


DVM   (2010-04-03 19:48:00) [26]


> Игорь Шевченко ©   (03.04.10 19:39) [5]

Ааа. Я подумал, что это относится к

> Правильно ли я мыслю?


Игорь Шевченко   (2010-04-03 19:39:00) [27]

DVM ©   (03.04.10 19:38) [4]

Мое "Нет" относится к тому, что код неэквивалентен. И он действительно неэквивалентен :)


DVM   (2010-04-03 19:38:00) [28]


> Игорь Шевченко ©   (03.04.10 18:48) [2]


> нет

Я не вижу никаких принципиальных отличий [0] от [3]. Кроме разве что в [3] более подробно и рассматривается SendNotifyMessage и прочие функции.

Единственно в [0] мне не нравится вот это:

PostMessage(H,BM_CLICK,0,0);
Application.ProcessMesseges;

Притягивание за уши асинхронного к синхронному. И проблемы возможны.


Игорь Шевченко   (2010-04-03 18:54:00) [29]

Статья в тему:
http://transl-gunsmoker.blogspot.com/2010/03/postmessage-sendnotifymessage.html


Игорь Шевченко   (2010-04-03 18:48:00) [30]


> верно?


нет


DVM   (2010-04-03 16:30:00) [31]

Ну вобщем верно.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо