Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стоит ли работать с GUI из разных потоков 
:(
    Опции темы
Nastya
Дата 20.7.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Вопрос скорее философии, но мнение мэтров действительно важно.
Я всегда считала, что работа с GUI должна всегда идти в одном потоке, если другие потоки хотят влиять на интерфейс, они шлют соотвествующим окнам /интерфейсным потоками сообщения (SendMessage/PostMessage).

Как на вашей практике, при нарушении этого правила, действоиельно возникают проблемы?


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
_hunter
Дата 20.7.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



правило не нарушал -- проблем не было smile
при нарушении правиал в Builder'е косяки ходили косяками...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Nastya
Дата 20.7.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



_hunter, а в MFC. по идеи оно там тоже не очень защищено? 
Просто я в тягостных раздумьях - переписывать ли мне тот код, который правила нарушает(не мой) или пущай живет :( 
Боюсь, что ленивый делает дважды :(



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
_hunter
Дата 20.7.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



насколько я знаю -- ни одно GUI не держит многопоточность и эти рекомендации -- общие.
в том же шарпе отладчик сразу же предупреждает если из другого потока обращаться к GUI...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 20.7.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Nastya @  20.7.2007,  16:07 Найти цитируемый пост)
а в MFC. по идеи оно там тоже не очень защищено?

Вообще никак не защищено.
Если, скажем, вызвать CDocument::UpdateAllViews() не в главном потоке (точнее, не в том потоке, которому принадлежат эти окна), из ASSERT'ов не вылезешь. Хотя, это тоже можно считать защитой smile  smile  smile 

Я пишу код так, чтобы все обращения к GUI были из главного потока. В критических местах ставлю 
ASSERT(AfxGetApp()==AfxGetThread());

Кстати, Invalidate из потока вполне можно вызвать...

Добавлено через 1 минуту и 10 секунд
Цитата(Nastya @  20.7.2007,  16:07 Найти цитируемый пост)
переписывать ли мне тот код, который правила нарушает(не мой) 

Если есть возможность - перепиши. Особенно, если не нравится.



--------------------
...
PM   Вверх
Nastya
Дата 20.7.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Цитата

Кстати, Invalidate из потока вполне можно вызвать...


ну, этот по-любому только мессадж выставит, а рисовсть-то он уже в интерфейсном потоке будет.

Я просто грустно созерцаю SetWindowText(...) из другого потока.
Как-то... представила что в это рвемя кто-то (тот же OnPaint) делает GetWindowTextLenght + GetWindowText ..... 
В общем...
Мэтрам. спасибо и респект smile 


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Earnest
Дата 20.7.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Nastya @  20.7.2007,  17:12 Найти цитируемый пост)
Я просто грустно созерцаю SetWindowText(...) из другого потока.

Кстати, вполне может прокатить (только не MFC-версия, а WinAPI): эта функция посылает WM_SETTEXT, которая в любом случае будет обрабатываться в потоке окна, и проблем с WM_PAINT не будет.
Сообщение WM_SETTEXT можно послать даже другому процессу, чего уж о потоке беспокоиться.

Но с точки зрения мировой гармонии, удачнее дизайн, когда к окну не получает доступ кто попало, а окно (панель или кто там у тебя) само лазит в свои поля и их обновляет, в главном потоке, естественно. А "кто попало" всего лишь выставляет флаг изменения (и ровно ничего про окно не знает). 


Это сообщение отредактировал(а) Earnest - 20.7.2007, 17:41


--------------------
...
PM   Вверх
Nastya
Дата 23.7.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Earnest, Ну вот, я только уверелась в своей правоте smile
А чем MFC SetWindowText отличется от API варианта ? (просто инетерсно). вроде тоже все самое 


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
zkv
Дата 23.7.2007, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(Nastya @  23.7.2007,  09:56 Найти цитируемый пост)
А чем MFC SetWindowText отличется от API варианта ?

Код

//afxwin2.inl
_AFXWIN_INLINE void CWnd::SetWindowText(LPCTSTR lpszString)
    { ASSERT(::IsWindow(m_hWnd)); ::SetWindowText(m_hWnd, lpszString); }

PM MAIL   Вверх
Earnest
Дата 24.7.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Ну, конкретно MFC::SetWindowText может и из потока прокатит. Но во многих функциях MFC сначала ищет окно в своем мэпе (а он для каждого потока разный), не находит (потому что поток не тот) и ругается.
Поэтому я, чтобы не проверять по каждому поводу - можно или нельзя, в потоках пользуюсь АПИ-функциями.
Примерно так.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0878 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.