Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1394183038
Eleon
2014-03-07 13:03
2014.11.16
Интрнет-трафик


15-1396983279
Ghost del vonte
2014-04-08 22:54
2014.11.16
Магия Delphi 2007


15-1397053687
Ламо777
2014-04-09 18:28
2014.11.16
Кто знает форумы по работе с клеточными автоматами?


2-1384614419
Macho
2013-11-16 19:06
2014.11.16
базы данных


15-1396946245
ТНЕ картман
2014-04-08 12:37
2014.11.16
забыл название программки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский