информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медЗа кого нас держат?Атака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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 ближе всего, но очередь сообщений не используется и сообщение не проходит через цикл сообщений
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach