Как отправить SendMessage () в окно, созданное в другом потоке? - PullRequest
5 голосов
/ 15 августа 2011

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

Поведение по умолчанию выглядит как block навсегда и не работает.

Таким образом, я изменил вызов на PostMessage, который не блокировал поток отправки, но сообщение никогда не поступало в предполагаемое окно.

Так как мне SendMessage открыть окно, созданное в отдельном потоке, или это невозможно?

Ответы [ 5 ]

1 голос
/ 15 августа 2011

Вы зашли в тупик. Например, если вы SendMessage перейдете в другой поток, то windowProc в этом потоке вернется к вашему окну SendMessage, они будут блокировать ожидание друг друга навсегда.

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

Для защиты от потоков, которые заняты или зависают, существует SendMessageTimeout.

1 голос
/ 15 августа 2011

Функция PostThreadMessage отправляет сообщение в очередь сообщений указанного потока.Вы можете указать Идентификатор темы, в которую должно быть отправлено сообщение.это ты хочешь?

1 голос
/ 15 августа 2011

Что делает поток, которому принадлежит целевое окно? Он должен качать сообщения, чтобы иметь возможность получать сообщения, которые либо отправлены, либо отправлены на него. Обычно это делается с помощью цикла GetMessage / TranslateMessage / DispatchMessage. Если поток выполняет что-то еще - например, блокирует ожидание завершения события, мьютекса или ввода-вывода или занят в каком-то другом цикле, выполняющем вычисления, он не будет получать сообщения: SendMessage в поток будет блокироваться, а PostMessage отправлю, но не получу.

Если этот целевой поток должен управлять событиями или аналогичными им, а также ему принадлежит окно, вам может понадобиться использовать MsgWaitForMultipleObjects в цикле сообщений этого потока.

1 голос
/ 15 августа 2011

Каждый созданный вами элемент управления принадлежит потоку, который его создал, что означает, что WndProc для этого элемента управления будет работать в потоке, который создал элемент управления. Вы отправляете сообщения с SendMessage и PostMessage свободно на любой элемент управления.

0 голосов
/ 05 августа 2016

Проблема с CWnd :: PostMessage и CWnd :: SendMessage одинакова.Сообщение выталкивается и не принимается ничем.SendMessage блокируется по замыслу;его задача - заблокировать поток, пока сообщение не будет получено.

MSDN говорит об этом SendMessage :

"Функция SendMessage вызывает оконную процедуру для указанного окна и не возвращается, пока оконная процедура не обработаласообщение. "

Можно отправить сообщение в окно в другом потоке, используя CWnd :: PostThreadMessage или winapi PostMessage .Когда вы создаете окно, вы можете использовать GetSafeHwnd (), чтобы получить дескриптор, или вы можете использовать идентификатор потока при создании потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...