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

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

Взаимная блокировка окон


Cobalt ©   (2002-12-02 17:10:00) 

Заблокируют ли окна друг друга, если 1-е пошлет (Send) сообщение 2-му, а второе (в ответ на сообщение 1-го) - 1-му?
Ведь перовое будет ожидать 2-го, а то - ответа 1-го.


Diamond Cat   (2002-12-05 03:28:00) [1]

даааа, ученье свет, но голова болит...


Набережных С.   (2002-12-04 20:48:00) [2]

>Diamond Cat © (04.12.02 03:03)

Это разные очереди(у потока их три). И, соответсвенно, разные механизмы их обработки. За время простоя или работы потока к нему могут поступить несколько вызовов SendMessage и т.п. - надо ведь как-то их разруливать.


Игорь Шевченко   (2002-12-04 09:05:00) [3]

Diamond Cat © (04.12.02 03:03)

Эта...Рихтера почитать не вредно...Кроме Help"a. Help - это краткая справка, без подробностей и растолковывания внутренней реализации...


Diamond Cat   (2002-12-04 03:03:00) [4]

ну даже не знаю в хелпе написано , что sendmessage рулит прямо на обработку


Игорь Шевченко   (2002-12-03 09:49:00) [5]

Diamond Cat © (03.12.02 01:08)


> в случае с sendmessage сообшение минует очередь,


В случае разных потоков - не минует.
Разберем, как работает функция SendMessage в операционных системах Windows NT/2000/XP. В упрощенном виде ее реализация выглядит так:

LRESULT SendMessage (WND : HWND; Msg : UINT; wPARAM : WPARAM;
lParam : LPARAM);
begin
if (TestWindowThread(Wnd) = CurrentThread) AND NOT
MustCallKernel(Msg) AND NOT MsgHooksInstalled() then
Result := CallWindowProc(GetWndProc(Wnd), Wnd, Msg, wParam, lParam)
else
Result := NtUserMessageCall(Wnd, Msg, wParam, lParam,
GetWndProc(Wnd), ID_SENDMESSAGE);
end;


В случае одного потока происходит непосредственный вызов соответсвующей оконной процедуры, если сообщение не предусматривает его посылку через обращение к диспетчеру окон и не установлены хуки типа WH_CALLWNDPROC, WH_CALLWNDPROCRET.

В случае разных потоков или хуков или соответствующего сообщения,
вызов направялется диспетчеру окон, который ставит сообщение в очередь синхронных сообщений для потока, чьему окну посылается сообщение и пытается переключиться на этот поток.
Вот здесь возможна блокировка ( я вчера малость неправду сказал), так как поток, которому послано сообщение уже находится в ожидании и не может забрать сообщение из очереди синхронных сообщений. В этих случая рекомендуется использовать функции типа SendMessageTimeOut.

С уважением,


Cobalt   (2002-12-03 01:18:00) [6]

Да, я имел в виду именно SendMessage. Проверял для одного потока - блокировки не происходит.


Diamond Cat   (2002-12-03 01:08:00) [7]

>Игорь Шевченко
в случае с sendmessage сообшение минует очередь, так что при разных потоках, блокировка вполне возможна, я даже как-то сталкивался с такой проблемой.


troits   (2002-12-02 19:58:00) [8]

>Игорь Шевченко © (02.12.02 18:29)
А почему? Смотря как посылать. Если SendMessage, то IMHO, должна быть блокировка.
It calls the window procedure for the specified window and does not return until the window procedure has processed the message


Игорь Шевченко   (2002-12-02 18:29:00) [9]

Кстати, AFAIK, не будет блокировки. Для одного потока - точно.
Если из одной оконной процедуры вызвать другую оконную процедуру (в случае одного потока), то какой в этом криминал ?
В случае разных потоков (или процессов) сообщения ставятся в очередь, так что вроде тоже не должно быть блокировки...


Digitman   (2002-12-02 17:30:00) [10]


> Игорь Шевченко


Ну ты нашел чего спросить)))... Чел запросто может и не подозревать об этих "тонкостях" при такой постановке вопроса)


Игорь Шевченко   (2002-12-02 17:17:00) [11]

Окна одного потока ?


Наверх

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