Форум: "WinAPI";
Текущий архив: 2014.11.16;
Скачать: [xml.tar.bz2];
ВнизВот есть PostMessage и SendMessage Найти похожие ветки
← →
tippa © (2010-04-03 16:23) [0]Вот есть 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);
верно?
← →
DVM © (2010-04-03 16:30) [1]Ну вобщем верно.
← →
Игорь Шевченко © (2010-04-03 18:48) [2]
> верно?
нет
← →
Игорь Шевченко © (2010-04-03 18:54) [3]Статья в тему:
http://transl-gunsmoker.blogspot.com/2010/03/postmessage-sendnotifymessage.html
← →
DVM © (2010-04-03 19:38) [4]
> Игорь Шевченко © (03.04.10 18:48) [2]
> нет
Я не вижу никаких принципиальных отличий [0] от [3]. Кроме разве что в [3] более подробно и рассматривается SendNotifyMessage и прочие функции.
Единственно в [0] мне не нравится вот это:
PostMessage(H,BM_CLICK,0,0);
Application.ProcessMesseges;
Притягивание за уши асинхронного к синхронному. И проблемы возможны.
← →
Игорь Шевченко © (2010-04-03 19:39) [5]DVM © (03.04.10 19:38) [4]
Мое "Нет" относится к тому, что код неэквивалентен. И он действительно неэквивалентен :)
← →
DVM © (2010-04-03 19:48) [6]
> Игорь Шевченко © (03.04.10 19:39) [5]
Ааа. Я подумал, что это относится к
> Правильно ли я мыслю?
← →
Игорь Шевченко © (2010-04-03 19:56) [7]
> Правильно ли я мыслю?->
> здесь "//дальнейший код" не начнет выполнятся пока не нажмется
> клаваша.
Дальнейший код не будет выполняться, пока не вернется вызов оконной процедуры, а нажмется ли при этом клавиша - а фиг его знает.
← →
DVM © (2010-04-03 20:07) [8]
> Дальнейший код не будет выполняться, пока не вернется вызов
> оконной процедуры
Скорее всего он это и имел в виду просто так не совсем аккуратно написал. По крайней мере я понял как про возврат функции. О кнопке даже и не думал.
← →
Германн © (2010-04-04 02:19) [9]
> Игорь Шевченко © (03.04.10 19:39) [5]
>
> DVM © (03.04.10 19:38) [4]
>
> Мое "Нет" относится к тому, что код неэквивалентен. И он
> действительно неэквивалентен :)
>
Именно так. И прежде всего потому, что обработка сообщения посланного через SendMessage будет выполнена сразу, даже если в очереди сообщений сему окну на сей момент уже есть другие сообщения. Т.е. влезет первым в очередь как VIP-клиент. А PostMessage просто встанет в очередь как добропослушный гражданин Виндовс.
← →
Leonid Troyanovsky © (2010-04-04 07:23) [10]
> Германн © (04.04.10 02:19) [9]
> посланного через SendMessage будет выполнена сразу, даже
> если в очереди сообщений сему окну на сей момент уже есть
> другие сообщения.
У синхронных сообщений своя очередь.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-04-04 09:23) [11]
> 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.
← →
Игорь Шевченко © (2010-04-04 11:42) [12]Leonid Troyanovsky © (04.04.10 09:23) [11]
> Для однопоточного приложения нужда в посланиях собственным
> окнам весьма экзотична
Ну почему же ? Для реализации паттерна "сделай что-то там, только потом, но не забудь".
← →
Leonid Troyanovsky © (2010-04-04 12:05) [13]
> Игорь Шевченко © (04.04.10 11:42) [12]
> Ну почему же ? Для реализации паттерна "сделай что-то там,
> только потом, но не забудь".
Все уже сделано до нас: TApplicationEvents.OnIdle.
--
Regards, LVT.
← →
Игорь Шевченко © (2010-04-04 12:28) [14]Leonid Troyanovsky © (04.04.10 12:05) [13]
Не понял. Обработка сообщений может касаться отдельных форм и какой смысл тащить весь этот огород в Application.OnIdle ?
← →
Leonid Troyanovsky © (2010-04-04 12:54) [15]
> Игорь Шевченко © (04.04.10 12:28) [14]
> Не понял. Обработка сообщений может касаться отдельных форм
> и какой смысл тащить весь этот огород в Application.OnIdle
Я про TApplicationEvents.
Все просто: кладешь на форму, и метод формы назначаешь.
Можно и в рантайм создать, обработчик - снова метод формы.
--
Regards, LVT.
← →
Дмитрий С © (2010-04-04 17:03) [16]
> Для однопоточного приложения нужда в посланиях собственным
> окнам весьма экзотична
Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной формы в обработчике OnShow. А в обработчике сообщения WM_USER+1 выполняю код, который необходимо выполнить сразу после появления формы на экране, например, обновление списка.
Это как пример. Можно, конечно, первый OnIdle после OnShow обработать, но с сообщением, имхо проще и нагляднее.
← →
Leonid Troyanovsky © (2010-04-04 18:04) [17]
> Дмитрий С © (04.04.10 17:03) [16]
> Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной
> формы в обработчике OnShow.
А чего б в OnShow коду не выполниться?
--
Regards, LVT.
← →
Игорь Шевченко © (2010-04-04 19:12) [18]Leonid Troyanovsky © (04.04.10 18:04) [17]
А в OnShow форма еще не видна.
Сравни поведение в двух случаях:type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Sleep(3000);
end;
иconst
UM_SLEEP = WM_APP + 1;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure UmSleep (var Message: TMessage); message UM_SLEEP;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
PostMessage(Handle, UM_SLEEP, 0, 0);
end;
procedure TForm1.UmSleep(var Message: TMessage);
begin
Sleep(3000);
end;
← →
Leonid Troyanovsky © (2010-04-04 19:59) [19]
> Дмитрий С © (04.04.10 17:03) [16]
> Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной
> формы в обработчике OnShow. А в обработчике сообщения WM_USER+1
> выполняю код, который необходимо выполнить сразу после появления
> формы на экране, например, обновление списка.
> Игорь Шевченко © (04.04.10 19:12) [18]
> А в OnShow форма еще не видна.
И обновление списка не выполнится?
Ну, пусть так.
TForm.UpdateActions - там оно выполнится наверняка.
--
Regards, LVT.
← →
Игорь Шевченко © (2010-04-04 20:18) [20]Leonid Troyanovsky © (04.04.10 19:59) [19]
> И обновление списка не выполнится?
Выполнится, но форма будет показана после того, как. А пользователь жмет на кнопку и видит окно через какой-то интервал времени, у него возникает фрустрация.
> TForm.UpdateActions - там оно выполнится наверняка.
В этом случае фрустрация возникнет у программиста, читающего код :)
← →
Германн © (2010-04-05 02:03) [21]
> Leonid Troyanovsky © (04.04.10 07:23) [10]
>
>
> > Германн © (04.04.10 02:19) [9]
>
> > посланного через SendMessage будет выполнена сразу, даже
> > если в очереди сообщений сему окну на сей момент уже есть
> > другие сообщения.
>
> У синхронных сообщений своя очередь.
>
То же самое только в профиль. :)
← →
Anatoly Podgoretsky © (2010-04-05 08:54) [22]> Германн (05.04.2010 02:03:21) [21]
Откуда она вообще может взяться?
← →
Суслик__ (2010-04-05 21:08) [23]Я тоже регулярно PostMessage использую для посылки самому себе.
Один из случаев описан выше Дмитрием.
← →
Anatoly Podgoretsky © (2010-04-05 21:40) [24]> Суслик__ (05.04.2010 21:08:23) [23]
Из обработчиков OnCreate, OnActivate, OnShow нет другого метода
← →
Германн © (2010-04-06 01:52) [25]
> Anatoly Podgoretsky © (05.04.10 08:54) [22]
>
> > Германн (05.04.2010 02:03:21) [21]
>
> Откуда она вообще может взяться?
>
А х.з.
Но я точно знаю, что Леонид гораздо лучше знает матчасть чем я. Я сужу только по своей практике. Не очень большой увы.
Но даже и по небольшой могу поверить что очередь всё-таки есть. Перестраховка блин. :)
← →
Германн © (2010-04-06 01:54) [26]
> Суслик__ (05.04.10 21:08) [23]
>
> Я тоже регулярно PostMessage использую для посылки самому
> себе.
> Один из случаев описан выше Дмитрием.
>
Классический пример приводил ЮЗ. Ссылку не помню.
← →
Leonid Troyanovsky © (2010-04-06 08:08) [27]
> Германн © (06.04.10 01:52) [25]
> Но даже и по небольшой могу поверить что очередь всё-таки
> есть. Перестраховка блин. :)
http://groups.google.com/group/fido7.su.win32.prog/browse_thread/thread/b71bc5c51698d898/03c765f2ac3694dd#03c765f2ac3694dd
--
Regards, LVT.
← →
Игорь Шевченко © (2010-04-06 12:00) [28]Leonid Troyanovsky © (06.04.10 08:08) [27]
Очередь сообщений - это вовсе и не очередь, а куча разнообразных структур и флагов.
Кстати, по поводу сообщений, ссылка на полезную статью:
http://transl-gunsmoker.blogspot.com/2010/04/blog-post_05.html
← →
Anatoly Podgoretsky © (2010-04-06 12:05) [29]А логически?
← →
Игорь Шевченко © (2010-04-06 12:07) [30]Anatoly Podgoretsky © (06.04.10 12:05) [29]
Логически очередь. Для сообщений от клавиатуры и мыши :)
← →
Leonid Troyanovsky © (2010-04-06 13:56) [31]
> Игорь Шевченко © (06.04.10 12:07) [30]
> Логически очередь. Для сообщений от клавиатуры и мыши :)
Рихтер различает 4 очереди, хотя , возможно, что логически
она и одна, с различением приоритетов и флагов.
> Кстати, по поводу сообщений, ссылка на полезную статью
Полезно такое не забывать, спасибо.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2014.11.16;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.002 c