Форум: "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.014 c