Russian Qt Forum

Qt => Общие вопросы => Тема начата: Mityai от Март 02, 2010, 10:09



Название: Перетаскивание окон и потоки
Отправлено: 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 останавливается, как только берусь за рамку главного окна, не важно, с какой целью - перемещать или изменять масштаб

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

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