Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];

Вниз

Взаимная блокировка окон   Найти похожие ветки 

 
Cobalt   (2002-12-02 17:10) [0]

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


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

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


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


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


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


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

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



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

>Игорь Шевченко © (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


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

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


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

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


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

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.

С уважением,


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

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


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

Diamond Cat © (04.12.02 03:03)

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


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

>Diamond Cat © (04.12.02 03:03)

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


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-62564
Barman
2003-01-10 22:40
2003.01.20
Работа с панелью задач


3-62416
stoper
2002-12-25 18:12
2003.01.20
ASCII&Delphi


14-62735
AndrewBee
2002-12-31 20:01
2003.01.20
Софт для быстрой разработки компонент


1-62574
race1
2003-01-11 14:42
2003.01.20
dll


1-62562
diks
2003-01-11 12:38
2003.01.20
Помогите





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