Re[4]: Спасибо всем огромное! ... но, вопросы остались :)
От: Sashko Россия http://www.dc.baika.ru/
Дата: 07.12.01 03:40
Оценка: 3 (1)
Здравствуйте Serop, Вы писали:

S>1 — всегда ли можно посылать в нитку сообщения (PostThreadMessage), независимо от того, есть ли у нее очередь сообщений или нет???? Если очереди нет, а посылать можно, а главное, получать его в нитке тоже можно, то, вновь прешедшее сообщение будет "затирать" предыдущее, необработанное? (а где это одно сообщение хранится? а если хранится одно, почему нет места для других?.. странно это всё, точно нужно умные книжки почитать


Посылать можно всегда. Но возможны следующие варианты. ID нитки не правильный (другими словами нитки с таким ID'ом не существует) или нитка не имеем message queue. В этом случае PostThreadMessage вернет FALSE. Понятно, что посланное тобой сообщение пропадет без следа, так как нет получателя. Вариант второй, нитка есть и у нее создана message queue (это двусвязанный список), в этом случае PostThreadMessage добавит сообщение в конец очереди (причем никого затирать не будет) и сразу вернется, вернув (скорей всего ) TRUE. Про книжку смотри дальше.

S>2 — Если есть очередь сообщений, всегда ли должен быть "message pump" организованный системой или базовым классом? или он может быть "самодельным"? (думаю, скорее второе)


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

S>3 — опционально не монимаю: правильно ли использовать методику передачи сообщений таким образом между нитями, особенно когда могут возникать замкнутые контуры?... Кажется, что это стратегически неверно, а нужно использовать методу синхронизации потоков (нитей) через эвенты, семафоры и т.д.?


Что значит замкнутые контуры, это два SendMessage друг дугу или что. Передавать сообщения между нитками можно и нужно, иначе для чего вообще все это было разработано. Существует два типа передачи сообщений, синхронный (SendMessage) и асинхронный (PostMesage и асинхронные варианты SendMessage). Смотри дальше.

S>Я только учусь, поэтому многое не понятно...

S>Может кто порекомендует книжку умную про ЭТО

Почитай Richter, Jeffrey Programming Applications for Microsoft Windows. Любую из редакций. Там есть целый раздел посвященный Window Messaging. И вообще хорошо расписаны методы и способы синхронизации. Думаю, будет очень полезна тебе.
Re[3]: Посылка сообщений в worker thread...
От: Serop  
Дата: 07.12.01 14:22
Оценка:
S>Неточность, очередь сообщений создается в момент, когда нитка (созданная и еще не имеющая очереди сообщения) вызывает USER'овскую функцию (CreateWindow, GetMessage etc). А так можно хоть заотправляться в нее сообщениями, очередь создаваться не будет.
Кстати, для приблизительно окончательной расстановки всех точек над ё, по поводу очереди, MSDN в объяснении про функцию PostThreadMessage утверждает, что очередь нитке можно создать (если вдруг функция действительно завершилась неудачай по причине отсутствия очереди сообщений у нитки) повторной посылкой сообщения в нить, до тех пор, пока она не создастся. Т.е. минимальным условием создания очереди сообщений, в том числе, является попытка послать сообщения в срэд этой функцией?
http://wiki.swrus.com — shareware FAQ
Re[4]: Посылка сообщений в worker thread...
От: Sashko Россия http://www.dc.baika.ru/
Дата: 08.12.01 07:41
Оценка:
Здравствуйте Serop, Вы писали:


S>Кстати, для приблизительно окончательной расстановки всех точек над ё, по поводу очереди, MSDN в объяснении про функцию PostThreadMessage утверждает, что очередь нитке можно создать (если вдруг функция действительно завершилась неудачай по причине отсутствия очереди сообщений у нитки) повторной посылкой сообщения в нить, до тех пор, пока она не создастся. Т.е. минимальным условием создания очереди сообщений, в том числе, является попытка послать сообщения в срэд этой функцией?


The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use one of the following methods to handle this situation:

Call PostThreadMessage. If it fails, call the Sleep function and call PostThreadMessage again. Repeat until PostThreadMessage succeeds.

Смысл таков. Ты запустил нитку, и сразу делаешь PostThreadMessage в нее, вызов фалит, так как вновь запущенная нитка еще не успела вызвать USER'овскую функцию, которая создаст очередь. В этом случае предлагают послипать и попытаться еще раз послать сообщение. Но это не говорит, что делая PostThreadMessage в другую нитку, она (PostThreadMessage) в ней создаст очередь сообщений.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.