Название: Перетаскивание окон и потоки Отправлено: Mityai от Март 02, 2010, 10:09 Доброго времени суток! Столкнулся с такой проблемой - мной создан дополнительный поток приложения, который постоянно выдает изменившуюся информацию для отображения. Проблема состоит в том, что при попытке перетащить какое-либо окно приложения по экрану поток вроде бы "засыпает", и выдача информации приостанавливается. Окон приложения несколько, поэтому даже если невозможно сделать перерисовку в непосредственно перетаскиваемом окне, было бы неплохо продолжить выдачу данных для других окон. Взаимодествие с потоком происходит сигнально-слотовым методом. Буду благодарен за любой совет!
Название: Re: Перетаскивание окон и потоки Отправлено: Авварон от Март 02, 2010, 10:31 насколько я помню, на каких-то ОС перетаскивание окна блокирует главный цикл. Однако эвенты все равно приходят и накапливаются в буфере. Они будут обработаны все разом при отпускании мыши. Короче, могу ошибаться, но такое поведение нормально.
Название: Re: Перетаскивание окон и потоки Отправлено: Mityai от Март 02, 2010, 10:35 Нет, в общем-то если бы эвенты накапливались, а потом приходили все разом, это был бы не худший вариант, но то ли я как-то не так написал, то ли что, но у меня именно обработка приостанавливается и возобновляется только после отпускания окна. То есть по сути эвенты даже не появляются. Если нужен код, могу в принципе собрать из него что-то удобоваримое.
Название: Re: Перетаскивание окон и потоки Отправлено: SASA от Март 02, 2010, 11:04 На сколько я понимаю, это особенность Qt. Победить это нельзя.
Название: Re: Перетаскивание окон и потоки Отправлено: Mityai от Март 02, 2010, 11:10 2 SASA:
А чисто теоритически с чем это может быть связано? Событие "сдвиг окна" блокирует выполнение любой остальной части кода? Название: Re: Перетаскивание окон и потоки Отправлено: ритт от Март 02, 2010, 14:23 при чём тут особенность кутэ?
Mityai: ты же под вендой, да? открой консоль и запусти сборку хоть того же кутэ - а теперь попробуй перемещать окно с консолью... Название: Re: Перетаскивание окон и потоки Отправлено: Mityai от Март 02, 2010, 15:15 2 Константин:
Намекаете на то, что это Винда вся по своей сути в этом отношении кривая? Просто ради интереса запустил простейшую Косынку; там время при перетаскивании все же обновляется. Хотя в том же Пинболе ситуация схожа моей. Название: Re: Перетаскивание окон и потоки Отправлено: kkk777kkk от Март 02, 2010, 15:49 для примера запустил свою прожку, которая просто берет и рисует синус, при перетаскивании перерисовывается нормально, правда точки добавляются постоянно и после каждой виджету update()
Название: Re: Перетаскивание окон и потоки Отправлено: ритт от Март 02, 2010, 16:37 я не намекал на кривость. я лишь говорил о том, что это - известная проблема.
но как я сам с ней боролся уже не помню... Название: Re: Перетаскивание окон и потоки Отправлено: Mityai от Март 02, 2010, 16:43 2 Константин:
А хоть в каком направлении копать? Попробовать у нас на форуме или нужны более глобальные поиски вариантов работы с оконными приложениями Виндоуз в целом, не только для Qt? Название: Re: Перетаскивание окон и потоки Отправлено: ритт от Март 02, 2010, 18:04 здесь точно что-то подобное обсуждалось (в первой ветке, наверное). а так - гугль, яндех и т.п.
Название: Re: Перетаскивание окон и потоки Отправлено: Mityai от Март 03, 2010, 09:26 Всем спасибо за помощь! Если вспомнится что-то новое, пишите. Если найду решение сам, тоже отпишусь!
Название: Re: Перетаскивание окон и потоки Отправлено: Mityai от Апрель 07, 2010, 10:09 Наконец нашел возможность немножко заняться этой проблемой. Собственно, копание мануала дало мне следующие результаты:
1) Нашлась функция void QWidget::moveEvent ( QMoveEvent * event ), которая реагирует на перемещение окна, но, как не сложно догадаться, тупой тык мышкой в Title Bar и удержание кнопки без движения окна она не ловит. 2) Существует конструкция Qt::EventPriority. Хотелось бы выяснить реально ли навесить paintEvent приоритет выше, чем на нажатие Title Bar, как это сделать и не приведет ли это к печальным последствиям в обработке событий. 3) bool QGraphicsWidget::windowFrameEvent ( QEvent * event ), одно из возможно возвращаемых событий как раз Qt::TitleBarArea. Но как я понял, QWidget, от которого мы по умолчанию наследуемся, и QGraphicsWidget - множко разные вещи и вытащить мне оттуда этот эвент не удастся. Может кто-нидь работал с QGraphicsWidget? Поделитесь, пожалуйста впечатлениями. В дополнение к первому вопросу, может есть возможность отловить mouseEvent при попадании курсора по всей ширине и длине Title Bar? Или он все-таки распространяется исключительно на клиентскую часть окна и никак это не изменить? Камрады, слово за вами... Название: Re: Перетаскивание окон и потоки Отправлено: Гурман от Апрель 07, 2010, 14:46 видимо проблема с синхронизацией дополнительного потока, если имеется в виду QThread, и с типом соединения, через которое поток посылает сообщения в главное окно
проверил сейчас у себя, запустил в параллельном потоке в фоне вывод в один из доков, который лежит в главном окне, и начал все приложение таскать - внимание - параллельно работающая нить QThread останавливается, как только берусь за рамку главного окна, не важно, с какой целью - перемещать или изменять масштаб если ковыряться в других доках, которые в главной нити, связанной с главным окном, то второй поток работает без фокусов кстати, интересно... хотелось бы иметь возможность выполнения параллельной нити, когда окно меняется, хотя сейчас для меня это не обязательно |