информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяГде водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[Win32] GUI & Threads - как перерисовывается окно ? 21.05.02 11:29  Число просмотров: 1154
Автор: 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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach