Поток, который вызывает функцию SendMessage, чтобы отправить сообщение другому потоку, не может продолжать выполнение до тех пор, пока оконная процедура, которая приняла сообщение, не возвратит значение. Если принимающий поток уступил управление в процессе обработки сообщения, передающий поток не может продолжать выполнение задачи, потому что он ожидает от SendMessage возврата значения. Если принимающий поток связан с той же самой очередью, что и отправитель, это может стать причиной блокировки (зависания) приложения.
Обратите внимание! на то, что, что журнал фильтра (hook) сообщений закрепляет потоки за этой же самой очередью. Обратите внимание! на то, что принимающий поток не должен отдавать управление явно; вызов любой из ниже перечисленных функций может заставить поток уступить управление не явным образом. |
Чтобы избежать потенциальных блокировок в вашем приложении, чаще обращайте внимание на использование функций SendNotifyMessage или SendMessageTimeout. В противном случае, оконная процедура может определить, отправлялось ли сообщение, которое она получила, другим потоком при помощи вызова функции InSendMessage или InSendMessageEx. Перед вызовом любой из функций в предшествующем списке при обработке сообщения, оконная процедура должна сначала вызвать InSendMessage или InSendMessageEx. Если эта функция возвращает значение ИСТИНА (TRUE), оконная процедура должна вызвать функцию ReplyMessage перед вызовом любой функцией, которая заставляет поток уступить управление.