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

Вниз

Очередь сообщений потока.   Найти похожие ветки 

 
Тимохов ©   (2004-05-14 14:08) [0]

Насколько я понимаю сообщения можно посылать как потоку, так и окну, которым поток владеет.

Предствим себе - есть поток без единого окна. Как в этом случае послать асинхронное сообщение (через PostThreadMessage и PostMessage) я понимаю.

Вопрос Как послать такому потоку синхронное сообщение (через SendMessage)? Насколько я понимаю - никак. Или все-таки синхронное сообщение послать можно, но не через SendMessage, а через какую-то другую функцию?


 
clickmaker ©   (2004-05-14 14:10) [1]

никак


 
Игорь Шевченко ©   (2004-05-14 14:13) [2]


> Как послать такому потоку синхронное сообщение (через SendMessage)?
>


При SendMessage происходит вызов оконной процедуры, обрабатывающей сообщение и ВОЗВРАЩАЮЩЕЙ РЕЗУЛЬТАТ.
Кто в потоке будет возвращать результат ?


 
Тимохов ©   (2004-05-14 14:17) [3]


> Игорь Шевченко ©   (14.05.04 14:13) [2]

Т.е. ваш ответ солидарен с первым оратором?

Да я тоже так думаю - решил всего лишь увериться в своем знании посредством получения ответа от людей точно это знающих.

Спасибо.


 
Игорь Шевченко ©   (2004-05-14 14:31) [4]

Тимохов ©   (14.05.04 14:17)

Я к чему речь веду - синхронные сообщения неявно подразумевают возврат результата обработки сообщения, так как вызывающий поток блокируется до тех пор, пока вызываемая процедура не обработает сообщение. То есть, послать синхронное сообщение без конкретной ОКОННОЙ процедуры, обрабатывающей это сообщение, нельзя в принципе.
Кроме того, в самих функциях SendMessagexxxx есть проверка на то, что в качестве HWND передан либо корректный Handle окна либо HWND_DESKTOP, либо HWND_BROADCAST, в последнем случае сообщение посылается всем окнам, результат, разумеется, непредсказуем, но синхронизация соблюдается. Если Handle окна некорректный, то происходит мновенный возврат из SendMessage(xxxxx) с результатом, равным нулю.


 
Digitman ©   (2004-05-14 15:16) [5]


> Тимохов ©   (14.05.04 14:08)  


никак.

синхронность возможна лишь при посылке/обработке ОКОННЫХ сообщений (SendMessageXXX), но не сообщений потоку (PostThreadmessage)

само различие префикса в именованиях ф-ций - Send и Post - говорит о том, что при первом идет речь о возможной синхронности, а при втором - о невозможности синхронности в ринципе


 
Тимохов ©   (2004-05-14 15:25) [6]

Спасибо за ответы.

Я вот чтО под этому поводу думаю: может быть было неудачной идеей (имхо конечно :))) назвать окна окнами? Ведь, что получается - иногда окна приходится создавать не для того, чтобы, что-то нарисовать, а лишь для того, чтобы обработать сообщение. Может быть окна, как-то нужно было назвать типа "Гнездо сообщений" :))) Тогда не было бы ассоциации с визуалкой и более точно бы это все отражало смысл.

опять же имхо, не кидайтесь...


 
Digitman ©   (2004-05-14 15:28) [7]


> Тимохов ©   (14.05.04 15:25) [6]


в принципе в использовании потоком невиз.ОКНА для организации синхр.обмена сообщениями с иными потоками нет ничего страшного - при невиз.окне занимаемые GDI-ресурсы минимальны ...так что во многих случаях этот вариант вполне приемлем


 
Тимохов ©   (2004-05-14 15:32) [8]


> так что во многих случаях этот вариант вполне приемлем

Да, действительно приемлем, а другого наверное просто и нет :))

Думаю, что если бы Бил сейчас windows писал, он бы подумал над тем, что я говорю (может быть даже посоветоваться пришел:))).

Т.е. есть гнездо обработки сообщений. Оно принадлежит потоку. Есть окно, которое обязательно имеет гнездо обработки сообщений. Окно принадлежит потоку. Т.к. образом обработка send сообщения происходит так: просматриваются все гнезда непосредственно принадлежащие потоку, затем просматриваюсят все окна.


 
Игорь Шевченко ©   (2004-05-14 15:35) [9]


> Ведь, что получается - иногда окна приходится создавать
> не для того, чтобы, что-то нарисовать, а лишь для того,
> чтобы обработать сообщение.


Для этого можно и не создавать окно, а обрабатывать сообщения в цикле выборки сообщений (или PeekMessage) потока, но сообщения будут асинхронными, разумеется. Другой вариант - создавать невидимое окно.
Система устроена более чем интересно - оконная процедуры является свойством оконного класса, как известно, но вот послать сообщение (синхронное) можно только окну, но никак не оконному классу. Зачем и почему так сделали - это надо спрашивать у MS, моя компетентность на этом заканчивается.


 
nikkie ©   (2004-05-15 02:44) [10]

>оконная процедуры является свойством оконного класса, как известно
в адресном пространстве какого процесса, разрешите полюбопытствовать?


 
SPeller ©   (2004-05-15 09:30) [11]


> в адресном пространстве какого процесса, разрешите полюбопытствовать?

Наверное вопрос не корректен. Процедура принадлежит некому модулю, поэтому любой процесс, загрузивший этот модуль в своё адресное пространство, будет иметь к ней доступ. Поэтому так как общие виндовые контролы содержатся в одной библиотеке, которая загружена в единственном экземпляре и доступна всем процессам, то и вопрос о различии адресных пространств внимается сам собой. Это моё имхо, как я понимаю эту ситуацию.

А по сабжу: для ручного устройсва синхронизации между потоками можно сделать функцию, которая будет останавливать поток, вызывать нужную функцию, возвращать рзультат и отправлять поток работать дальше. Именно так, по-моему, в TThread, в Synchronize сделано. Если поток свой, то можно массу синхронизирующих способов придумать. Но если поток чужой, то вероятность предельно мала.


 
nikkie ©   (2004-05-15 11:42) [12]

>Speller
>Наверное вопрос не корректен.
подождем ответа Игоря, я думаю, он признает, что [9] - это просто временное помрачение было.

>общие виндовые контролы
речь шла об окнах вообще...

>доступна всем процессам, то и вопрос о различии адресных пространств внимается сам собой.
а в контексте какого процесса/потока вызывать ее тоже не неважно?


 
Игорь Шевченко ©   (2004-05-15 12:36) [13]


> в адресном пространстве какого процесса, разрешите полюбопытствовать?


В адресном пространстве процесса, зарегистрировавшего оконный класс, разумеется :)


 
Игорь Шевченко ©   (2004-05-15 12:51) [14]

nikkie ©   (15.05.04 11:42)


> [9] - это просто временное помрачение было.


Почему же ? Каждый GUI-процесс вызывает регистрацию оконных классов для standard controls на этапе инициализации user32. Весь список зарегистрированных оконных классов является принадлежностью Win32-процесса, иначе и быть не может, так как оконная процедура должна находиться в чьем-то адресном пространстве. Тебя никогда не удивлял тот факт, что ты можешь создать окно только от класса, зарегистрированного в твоем процессе либо от стандартного ? Так вот, стандартные тоже регистрируются в твоем процессе, только прозрачно для тебя.

С уважением,


 
nikkie ©   (2004-05-15 12:58) [15]

значит про помрачение не согласился? ;)

>но вот послать сообщение (синхронное) можно только окну, но никак не оконному классу.
то есть вызвать оконную процедуру? в контексте какого потока? для текущего можно воспользоваться GetClassLong + CallWndProc. только смысла я не вижу. а для чужого процесса нет уверенности, что этот класс в нем зарегистрирован.

Зачем и почему так сделали - это надо спрашивать у MS
спасибо MS за наше счастливое детство. был бы штатный способ вызова оконной процедуры без окна - это ж надо было в каждой wndproc проверять hwnd <> 0... а в чем тогда смысл возможности такого вызова?


 
Игорь Шевченко ©   (2004-05-15 13:14) [16]

nikkie ©   (15.05.04 12:58)


> значит про помрачение не согласился? ;)


Видишь ли, здесь усматривается аналогия между обычным методами объекта и классовыми. И то и другое имеет право на жизнь, не так ли ?


> то есть вызвать оконную процедуру? в контексте какого потока?


В контексте вызывающего, разумеется :)


> спасибо MS за наше счастливое детство


Кто ж с этим спорит ?


> был бы штатный способ вызова оконной процедуры без окна
> - это ж надо было в каждой wndproc проверять hwnd <> 0...
> а в чем тогда смысл возможности такого вызова?


Никогда не встречал в оконных процедурах действия при обработке сообщений, не связанные с конкретным окном ? :) А ведь таких есть, довольно часто при обработке сообщения WM_TIMER :))


 
nikkie ©   (2004-05-15 13:41) [17]

>Видишь ли, здесь усматривается аналогия между обычным методами объекта и классовыми. И то и другое имеет право на жизнь, не так ли ?
чего-то нет сейчас настроения пофилософствовать на эту тему. :)

>В контексте вызывающего, разумеется :)
так чем же CallWndProc не устраивает? имхо, весь смысл SendMessage - в том, что обработка происходит там где надо.


 
Игорь Шевченко ©   (2004-05-15 13:55) [18]

nikkie ©   (15.05.04 13:41)


> так чем же CallWndProc не устраивает?


Лишние телодвижения :)


> имхо, весь смысл SendMessage - в том, что обработка происходит
> там где надо.


Да, в процедуре оконного класса :) С указанием конкретного экземпляра окна, буде таковой экземпляр востребован при обработке посылаемого сообщения :)  


> чего-то нет сейчас настроения пофилософствовать на эту тему.


Обычно под пиво хороша такая философия :)


 
nikkie ©   (2004-05-15 13:58) [19]

>Да, в процедуре оконного класса :)
шутим... :)

>С указанием конкретного экземпляра окна
а следовательно и потока-владельца окна...

>Обычно под пиво хороша такая философия :)
пиво не пью :)


 
Игорь Шевченко ©   (2004-05-15 19:50) [20]


> >С указанием конкретного экземпляра окна
> а следовательно и потока-владельца окна...


Все, мысль на место встала :) Спасибо :)



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

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

Наверх





Память: 0.51 MB
Время: 2.306 c
3-1085475412
serg128
2004-05-25 12:56
2004.06.20
Есть ли какие-то агрегирующие функции в TClientDataSet?


10-1012801649
Orlangur
2002-02-04 08:47
2004.06.20
создание сервера


14-1086021870
выпускник
2004-05-31 20:44
2004.06.20
изложение 11 класс


8-1081162594
niko4543
2004-04-05 14:56
2004.06.20
Flash


6-1082634294
Aleksandr
2004-04-22 15:44
2004.06.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский