Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6459
Последний выпуск: 19.06.2015

Многопоточность и GUI

398
07 августа 2013 года
CassandraDied
763 / / 24.05.2012
Хай.
Есть приложение с GUI, которое рисует окна в своём основном потоке. Я подгружаю плагин через DLL и мне тоже необходимо нарисовать окно.
Вопрос: рисовать окно в основном потоке приложения или можно для этого создать свой поток?
Буду рад линкам на статьи по многопоточности и интерфейсам.
40K
07 августа 2013 года
D129
228 / / 18.04.2012
Технически нарисовать окно в другом потоке можно, но оно будет "мертвенькое" -
не будет реагировать на мышку.
Его можно будет закрыть из программы.

Основной поток получает сообщения от системы, и оборачивает их в эвенты, а созданный вами поток автоматически этого делать не будет.

То есть, врядли есть причина изголяться, подгружать данные можно в паралельном потоке, а вот рисование надо ставить в общую очередь.
398
07 августа 2013 года
CassandraDied
763 / / 24.05.2012
Ну, я не только поток создаю, но ещё и окно со всеми вытекающими. Так что события обрабатываются нормально.
40K
07 августа 2013 года
D129
228 / / 18.04.2012
Риторический вопрос - что за проблему это решает?
Зачем создавать в приложении еще один поток, когда у каждого контрола есть .Invoke(...)
:-)
398
07 августа 2013 года
CassandraDied
763 / / 24.05.2012
Я пишу только плагин к приложению, так что управлять главным потоком не могу. Плагин состоит из dll, в которой вызывается только одна функция самим приложением, а дальше — делай, что хочешь.
40K
07 августа 2013 года
D129
228 / / 18.04.2012
Ну пожалуй да, соглашусь, плагин лучше отвязать от основного приложения, в этом случае он действительно может делать "что хочешь".
398
07 августа 2013 года
CassandraDied
763 / / 24.05.2012
У меня не стоит вопроса "что будет лучше?". По-иному не получится сделать, я был бы рад. Если в основном потоке создать своё окно, тогда не завершится вызов DLL_ATTACH и приложение вообще подвиснет, зато моё окно будет перерисовываться.
6
07 августа 2013 года
@pixo $oft
3.4K / / 20.09.2006
Всё-таки ты создал эту тему :)
Цитата: D129
Зачем создавать в приложении еще один поток, когда у каждого контрола есть .Invoke(...)

Затем, что это не .Net FW.

Цитата: CassandraDied
приложение вообще подвиснет, зато моё окно будет перерисовываться.

Ну это же самое главное — чтоб твоё окно прорисовывалось ☺

Лично я бы создал в новом потоке. Собственно, у меня уже был положительный опыт, и вполне нормально такое окно работало, так что не надо тут.

398
07 августа 2013 года
CassandraDied
763 / / 24.05.2012
Цитата: @pixo $oft

Лично я бы создал в новом потоке. Собственно, у меня уже был положительный опыт, и вполне нормально такое окно работало, так что не надо тут.


После того как создал этот топик, нашёл на страницах MSDN информацию о возможности для каждого потока иметь своё окно. Но что-то тут не так всё просто. Есть какие-то подводные камни. Почему у Qt окна можно создавать только в основном потоке? Понятно, что из-за Qapplication, который обрабатывает события, но вот почему они решили сделать именно так?
Кстати, я потом пересоздал проект в Qt и заменил стандартный таймер фреймворковским, но счастье было недолгим. Через пару неудачных запусков понял, что QTimer тоже нуждается в QApplication и обработчике событий, а это значит, что всё равно надо создавать отдельный поток.

6
07 августа 2013 года
@pixo $oft
3.4K / / 20.09.2006
Возможно, им лень было изворачиваться и прописывать межпоточную синхронизацию — мол, пусть программисты сами заморачиваются.

Вот видишь, даже Qt тут не смог помочь…
398
07 августа 2013 года
CassandraDied
763 / / 24.05.2012
Цитата: @pixo $oft
Возможно, им лень было изворачиваться и прописывать межпоточную синхронизацию — мол, пусть программисты сами заморачиваются.

Вот видишь, даже Qt тут не смог помочь…


По-моему, нигде нет такой межпоточной синхронизации, даже в .NET, чтобы можно было парой строчек кода создать поток, окно и синхронизировать окна разных потоков, заодно где-нибудь влепить таймер, но в нём её реализация мне нравится больше всего. Только переносить плагин на .NET — выше моих сил. В Qt мне хотя бы не пришлось выбрасывать и переписывать все win api вызовы.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог