![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Вопрос скорее философии, но мнение мэтров действительно важно.
Я всегда считала, что работа с GUI должна всегда идти в одном потоке, если другие потоки хотят влиять на интерфейс, они шлют соотвествующим окнам /интерфейсным потоками сообщения (SendMessage/PostMessage). Как на вашей практике, при нарушении этого правила, действоиельно возникают проблемы? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
правило не нарушал -- проблем не было
![]() при нарушении правиал в Builder'е косяки ходили косяками... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
_hunter, а в MFC. по идеи оно там тоже не очень защищено?
Просто я в тягостных раздумьях - переписывать ли мне тот код, который правила нарушает(не мой) или пущай живет :( Боюсь, что ленивый делает дважды :( -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
насколько я знаю -- ни одно GUI не держит многопоточность и эти рекомендации -- общие.
в том же шарпе отладчик сразу же предупреждает если из другого потока обращаться к GUI... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Вообще никак не защищено. Если, скажем, вызвать CDocument::UpdateAllViews() не в главном потоке (точнее, не в том потоке, которому принадлежат эти окна), из ASSERT'ов не вылезешь. Хотя, это тоже можно считать защитой ![]() ![]() ![]() Я пишу код так, чтобы все обращения к GUI были из главного потока. В критических местах ставлю ASSERT(AfxGetApp()==AfxGetThread()); Кстати, Invalidate из потока вполне можно вызвать... Добавлено через 1 минуту и 10 секунд Если есть возможность - перепиши. Особенно, если не нравится. -------------------- ... |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
ну, этот по-любому только мессадж выставит, а рисовсть-то он уже в интерфейсном потоке будет. Я просто грустно созерцаю SetWindowText(...) из другого потока. Как-то... представила что в это рвемя кто-то (тот же OnPaint) делает GetWindowTextLenght + GetWindowText ..... В общем... Мэтрам. спасибо и респект ![]() -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Кстати, вполне может прокатить (только не MFC-версия, а WinAPI): эта функция посылает WM_SETTEXT, которая в любом случае будет обрабатываться в потоке окна, и проблем с WM_PAINT не будет. Сообщение WM_SETTEXT можно послать даже другому процессу, чего уж о потоке беспокоиться. Но с точки зрения мировой гармонии, удачнее дизайн, когда к окну не получает доступ кто попало, а окно (панель или кто там у тебя) само лазит в свои поля и их обновляет, в главном потоке, естественно. А "кто попало" всего лишь выставляет флаг изменения (и ровно ничего про окно не знает). Это сообщение отредактировал(а) Earnest - 20.7.2007, 17:41 -------------------- ... |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Earnest, Ну вот, я только уверелась в своей правоте
![]() А чем MFC SetWindowText отличется от API варианта ? (просто инетерсно). вроде тоже все самое -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
||||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ну, конкретно MFC::SetWindowText может и из потока прокатит. Но во многих функциях MFC сначала ищет окно в своем мэпе (а он для каждого потока разный), не находит (потому что поток не тот) и ругается.
Поэтому я, чтобы не проверять по каждому поводу - можно или нельзя, в потоках пользуюсь АПИ-функциями. Примерно так. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |