V>Как работает SendMessage для разных нитей/процессов? В какой момент происходит вызов функции окна: когда опустошится очередь сообщений, когда нить заснет(станет свободной) или еще как-то?
Вопрос не совсем понятен, что конкретно нужно? Или просто интересно? :o)
Попробую ответить :-/
1. Поток, пославший SendMessage, тормозится системой пока сообщение не будет обработано (в отличии от PostMesssage).
2. Вызов функции окна происходит в любой момент, если в очереди сообщений есть хотя бы одно сообщение.
3. Очередь опустошится, когда вызов обработчика сообщений вызовется столько раз сколько сообщений в очереди :o) Вызовы не производятся параллельно.
4. ?
Если на пальцах, то представь, что ты занимаешся обработкой входящей почты компании "Get Any Message". Твоя основная работа — ждать прихода почтальона и бегать доставлять сообщения нуждающимся. Большую часть своего трудового дня ты крепко спишь. Когда приходит почтальон, то тебя бесцеремонно будят и вручают ОДНО письмо, только одно. Дальше ты бежишь с ним к получателю (кстати, вместе с тобой крепко спала вся контора... вот бы найти такую работку... хочу быть приложением виндоуз :), пинаешь его, вручаешь ему письмо и стоишь ждёшь, пока он его почитает, почешет репу и может быть сделает ещё что-нибудь полезное, например некотырые отморозки любят рисовать всякую фигню прямо на окне. Пока ты с деловым видом бегаешь по конторе, к тебе могут прийти другие почтальоны. Почтальоны бывают разные, некоторые спокойно занимают очередь и смирно стоят ждут, есть хамы, которые наровят пролесть без очереди, обосновывая это своим высоким приоритетом (из них может образоваться своя очередь в начале общей очереди, всё как обычно :), есть такие, которые посмотрев, кто тут уже стоит и увидев знакомого с аналогичным сообщением могут развернуться и свалить (так поступают нигодяи, которых посылает дядя Таймер). Наконец ты разобрался с первым письмом и, валясь с ног, еле-еле добираешся до своего места, говоришь первому почтальону, что информация доставлена и пытаешься немного расслабится, но здесь тебя опять дёргают и заставляют обработать следующее сообщение... и так, пока ты не удовлетворишь всех почтальонов или... пользователь не вырубит компьютер. Что касается SendMessage, то для имитации бурной деятельности твоей конторе нужно тоже иногда рассылать сообщения. Она это может делать двумя способами, через SendMessage или PostMessage. Первый случай подразумевает обязательное ожидание доставки, обработки сообщения и получения уведомления. Этот способ очень удобен, так как пока почтальон бегает с твоим письмом ты и вся твоя контора можете спать со спокойной совестью, у тебя есть отмазка — ты должен получить уведомление о доставке. Второй способ в этом смысле не так удобен, тебе придётся продолжить работу сразу после того как почтальон унесёт твоё сообщение, поэтому этот способ применяется гораздо реже.
Happy coding,
Igor.
Если нам не помогут, то мы тоже никого не пощадим.