> Допустим у меня есть главный поток А и второстепенный Б. > В потоке А создано окно. Потоку Б нужно его перерисовать и > он посылает что-нибудь вроде > > SendMessage( hWnd, WM_PAINT, ... ); > > Вопрос: как происходит перерисовка окна? >
С точки зрения идеологии Виндов WM_PAINT напрямую не посылается,
нужно вызывать InvalidateRect, а он уже поставит WM_PAINT в очередь
(или обновит регион перерисовки, если WM_PAINT уже висит в очереди).
Если поток хочет непременно дождаться окончания перерисовки - можно вызывать
что-нибудь вроде WaitForInputIdle, в простых случаях у меня это работает без проблем.
> Допустим у меня есть главный поток А и второстепенный Б. > В потоке А создано окно. Потоку Б нужно его перерисовать и > он посылает что-нибудь вроде > > SendMessage( hWnd, WM_PAINT, ... ); > > Вопрос: как происходит перерисовка окна? >
С точки зрения идеологии Виндов WM_PAINT напрямую не посылается,
нужно вызывать InvalidateRect, а он уже поставит WM_PAINT в очередь
(или обновит регион перерисовки, если WM_PAINT уже висит в очереди).
Если поток хочет непременно дождаться окончания перерисовки - можно вызывать
что-нибудь вроде WaitForInputIdle, в простых случаях у меня это работает без проблем.
[Win32] GUI & Threads - как перерисовывается окно ?21.05.02 11:08 Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
> SendMessage( hWnd, WM_PAINT, ... ); не хорошо так делать
есть функции InvalidateRect(), UpdateWindow(), RedrawWindow(),... - выбирай :)
SendMessage никогда не ставит сообщение в очередь
когда поток А вызывает какую-нить функцию работающую с сообщениями (типа PeekMessage, GetMessage, SendMessage,..., а значит и очень многие функции GUI) то система проверяет, не хочет ли кто-нить сделать этому потоку SendMessage
если да, то вызывает WindowProc (не попадая в цикл сообщений)
поток Б всё это время ждёт (если не использовал SendMessageTimeout() или SendNotifyMessgae())
т.е. твой вариант 2 ближе всего, но очередь сообщений не используется и сообщение не проходит через цикл сообщений