Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] GUI & Threads - как перерисовывается окно ? 20.05.02 22:24 Число просмотров: 921
Автор: ggg <ggg> Статус: Elderman
|
> SendMessage( hWnd, WM_PAINT, ... ); не хорошо так делать
есть функции InvalidateRect(), UpdateWindow(), RedrawWindow(),... - выбирай :)
SendMessage никогда не ставит сообщение в очередь
когда поток А вызывает какую-нить функцию работающую с сообщениями (типа PeekMessage, GetMessage, SendMessage,..., а значит и очень многие функции GUI) то система проверяет, не хочет ли кто-нить сделать этому потоку SendMessage
если да, то вызывает WindowProc (не попадая в цикл сообщений)
поток Б всё это время ждёт (если не использовал SendMessageTimeout() или SendNotifyMessgae())
т.е. твой вариант 2 ближе всего, но очередь сообщений не используется и сообщение не проходит через цикл сообщений
|
<programming>
|
[Win32] GUI & Threads - как перерисовывается окно ? 20.05.02 20:35
Автор: vim Статус: Незарегистрированный пользователь
|
Допустим у меня есть главный поток А и второстепенный Б.
В потоке А создано окно. Потоку Б нужно его перерисовать и он посылает что-нибудь вроде
SendMessage( hWnd, WM_PAINT, ... );
Вопрос: как происходит перерисовка окна?
1) Поток Б ставит сообщение в очередь для А и возвращает управление дальше. Позже поток А прочтет это сообщение из очереди и перерисует окно.
2) Поток Б ставит сообщение в очередь для А и ждет пока окно будет перерисовано в А, эатем возвращает управление дальше
3) Перерисовка происходит в контексте потока Б
Или может какой-то другой вариант ?
|
|
[Win32] GUI & Threads - как перерисовывается окно ? 21.05.02 11:29
Автор: ukv Статус: Незарегистрированный пользователь
|
> Допустим у меня есть главный поток А и второстепенный Б. > В потоке А создано окно. Потоку Б нужно его перерисовать и > он посылает что-нибудь вроде > > 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, ... );
Ну тогда уже и WM_NCPAINT делал бы :-)
> 1) Поток Б ставит сообщение в очередь для А и возвращает > управление дальше.
Нет. Чтобы так было, нужно юзать PostMessage. Думаю, понятно почему.
|
|
[Win32] GUI & Threads - как перерисовывается окно ? 20.05.02 22:24
Автор: ggg <ggg> Статус: Elderman
|
> SendMessage( hWnd, WM_PAINT, ... ); не хорошо так делать
есть функции InvalidateRect(), UpdateWindow(), RedrawWindow(),... - выбирай :)
SendMessage никогда не ставит сообщение в очередь
когда поток А вызывает какую-нить функцию работающую с сообщениями (типа PeekMessage, GetMessage, SendMessage,..., а значит и очень многие функции GUI) то система проверяет, не хочет ли кто-нить сделать этому потоку SendMessage
если да, то вызывает WindowProc (не попадая в цикл сообщений)
поток Б всё это время ждёт (если не использовал SendMessageTimeout() или SendNotifyMessgae())
т.е. твой вариант 2 ближе всего, но очередь сообщений не используется и сообщение не проходит через цикл сообщений
|
|
|