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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] GUI & Threads - как перерисовывается окно ? 21.05.02 11:29  Число просмотров: 1043
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Допустим у меня есть главный поток А и второстепенный Б.
> В потоке А создано окно. Потоку Б нужно его перерисовать и
> он посылает что-нибудь вроде
>
> SendMessage( hWnd, WM_PAINT, ... );
>
> Вопрос: как происходит перерисовка окна?
>

С точки зрения идеологии Виндов WM_PAINT напрямую не посылается,
нужно вызывать InvalidateRect, а он уже поставит WM_PAINT в очередь
(или обновит регион перерисовки, если WM_PAINT уже висит в очереди).
Если поток хочет непременно дождаться окончания перерисовки - можно вызывать
что-нибудь вроде WaitForInputIdle, в простых случаях у меня это работает без проблем.
<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: 1 s   Design: Vadim Derkach