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-06 13:56:00) [1]


> Игорь Шевченко ©   (06.04.10 12:07) [30]

> Логически очередь. Для сообщений от клавиатуры и мыши :)

Рихтер различает 4 очереди, хотя , возможно, что логически
она и одна, с различением приоритетов и флагов.

> Кстати, по поводу сообщений, ссылка на полезную статью

Полезно такое не забывать, спасибо.

--
Regards, LVT.


Игорь Шевченко   (2010-04-06 12:07:00) [2]

Anatoly Podgoretsky ©   (06.04.10 12:05) [29]

Логически очередь. Для сообщений от клавиатуры и мыши :)


Anatoly Podgoretsky   (2010-04-06 12:05:00) [3]

А логически?


Игорь Шевченко   (2010-04-06 12:00:00) [4]

Leonid Troyanovsky ©   (06.04.10 08:08) [27]

Очередь сообщений - это вовсе и не очередь, а куча разнообразных структур и флагов.

Кстати, по поводу сообщений, ссылка на полезную статью:
http://transl-gunsmoker.blogspot.com/2010/04/blog-post_05.html


Leonid Troyanovsky   (2010-04-06 08:08:00) [5]


> Германн ©   (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 01:54:00) [6]


> Суслик__   (05.04.10 21:08) [23]
>
> Я тоже регулярно PostMessage использую для посылки самому
> себе.
> Один из случаев описан выше Дмитрием.
>

Классический пример приводил ЮЗ. Ссылку не помню.


Германн   (2010-04-06 01:52:00) [7]


> Anatoly Podgoretsky ©   (05.04.10 08:54) [22]
>
> > Германн  (05.04.2010 02:03:21)  [21]
>
> Откуда она вообще может взяться?
>

А х.з.
Но я точно знаю, что Леонид гораздо лучше знает матчасть чем я. Я сужу только по своей практике. Не очень большой увы.
Но даже и по небольшой могу поверить что очередь всё-таки есть. Перестраховка блин. :)


Anatoly Podgoretsky   (2010-04-05 21:40:00) [8]

> Суслик__  (05.04.2010 21:08:23)  [23]

Из обработчиков OnCreate, OnActivate, OnShow нет другого метода


Суслик__   (2010-04-05 21:08:00) [9]

Я тоже регулярно PostMessage использую для посылки самому себе.
Один из случаев описан выше Дмитрием.


Anatoly Podgoretsky   (2010-04-05 08:54:00) [10]

> Германн  (05.04.2010 02:03:21)  [21]

Откуда она вообще может взяться?


Германн   (2010-04-05 02:03:00) [11]


> Leonid Troyanovsky ©   (04.04.10 07:23) [10]
>
>
> > Германн ©   (04.04.10 02:19) [9]
>
> > посланного через SendMessage будет выполнена сразу, даже
> > если в очереди сообщений сему окну на сей момент уже есть
> > другие сообщения.
>
> У синхронных сообщений своя очередь.
>

То же самое только в профиль. :)


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

Leonid Troyanovsky ©   (04.04.10 19:59) [19]


> И обновление списка не выполнится?


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


> TForm.UpdateActions - там оно выполнится наверняка.


В этом случае фрустрация возникнет у программиста, читающего код :)


Leonid Troyanovsky   (2010-04-04 19:59:00) [13]


> Дмитрий С ©   (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 19:12:00) [14]

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 18:04:00) [15]


> Дмитрий С ©   (04.04.10 17:03) [16]

> Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной
> формы в обработчике OnShow.

А чего б в OnShow коду не выполниться?

--
Regards, LVT.


Дмитрий С   (2010-04-04 17:03:00) [16]


> Для однопоточного приложения нужда в посланиях собственным
> окнам весьма экзотична

Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной формы в обработчике OnShow. А в обработчике сообщения WM_USER+1 выполняю код, который необходимо выполнить сразу после появления формы на экране, например, обновление списка.
Это как пример. Можно, конечно, первый OnIdle после OnShow обработать, но с сообщением, имхо проще и нагляднее.


Leonid Troyanovsky   (2010-04-04 12:54:00) [17]


> Игорь Шевченко ©   (04.04.10 12:28) [14]

> Не понял. Обработка сообщений может касаться отдельных форм
> и какой смысл тащить весь этот огород в Application.OnIdle

Я про TApplicationEvents.
Все просто: кладешь на форму, и метод формы назначаешь.

Можно и в рантайм создать, обработчик - снова метод формы.

--
Regards, LVT.


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

Leonid Troyanovsky ©   (04.04.10 12:05) [13]

Не понял. Обработка сообщений может касаться отдельных форм и какой смысл тащить весь этот огород в Application.OnIdle ?


Leonid Troyanovsky   (2010-04-04 12:05:00) [19]


> Игорь Шевченко ©   (04.04.10 11:42) [12]

> Ну почему же ? Для реализации паттерна "сделай что-то там,
>  только потом, но не забудь".

Все уже сделано до нас: TApplicationEvents.OnIdle.

--
Regards, LVT.


Игорь Шевченко   (2010-04-04 11:42:00) [20]

Leonid Troyanovsky ©   (04.04.10 09:23) [11]


> Для однопоточного приложения нужда в посланиях собственным
> окнам весьма экзотична


Ну почему же ? Для реализации паттерна "сделай что-то там, только потом, но не забудь".


Страницы:   1 2

Наверх

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