![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вот есть PostMessage и SendMessage
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]Ну вобщем верно.