Russian Qt Forum
Сентябрь 24, 2024, 08:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перетаскивание окон и потоки  (Прочитано 8270 раз)
Mityai
Гость
« : Март 02, 2010, 10:09 »

Доброго времени суток! Столкнулся с такой проблемой - мной создан дополнительный поток приложения, который постоянно выдает изменившуюся информацию для отображения. Проблема состоит в том, что при попытке перетащить какое-либо окно приложения по экрану поток вроде бы "засыпает", и выдача информации приостанавливается. Окон приложения несколько, поэтому даже если невозможно сделать перерисовку в непосредственно перетаскиваемом окне, было бы неплохо продолжить выдачу данных для других окон. Взаимодествие с потоком происходит сигнально-слотовым методом. Буду благодарен за любой совет!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Март 02, 2010, 10:31 »

насколько я помню, на каких-то ОС перетаскивание окна блокирует главный цикл. Однако эвенты все равно приходят и накапливаются в буфере. Они будут обработаны все разом при отпускании мыши. Короче, могу ошибаться, но такое поведение нормально.
Записан
Mityai
Гость
« Ответ #2 : Март 02, 2010, 10:35 »

Нет, в общем-то если бы эвенты накапливались, а потом приходили все разом, это был бы не худший вариант, но то ли я как-то не так написал, то ли что, но у меня именно обработка приостанавливается и возобновляется только после отпускания окна. То есть по сути эвенты даже не появляются. Если нужен код, могу в принципе собрать из него что-то удобоваримое.
« Последнее редактирование: Март 02, 2010, 10:43 от Mityai » Записан
SASA
Гость
« Ответ #3 : Март 02, 2010, 11:04 »

На сколько я понимаю, это особенность Qt. Победить это нельзя.
Записан
Mityai
Гость
« Ответ #4 : Март 02, 2010, 11:10 »

2 SASA:
А чисто теоритически с чем это может быть связано? Событие "сдвиг окна" блокирует выполнение любой остальной части кода?
Записан
ритт
Гость
« Ответ #5 : Март 02, 2010, 14:23 »

при чём тут особенность кутэ?
Mityai: ты же под вендой, да? открой консоль и запусти сборку хоть того же кутэ - а теперь попробуй перемещать окно с консолью...
Записан
Mityai
Гость
« Ответ #6 : Март 02, 2010, 15:15 »

2 Константин:
Намекаете на то, что это Винда вся по своей сути в этом отношении кривая? Просто ради интереса запустил простейшую Косынку; там время при перетаскивании все же обновляется. Хотя в том же Пинболе ситуация схожа моей.
« Последнее редактирование: Март 02, 2010, 15:32 от Mityai » Записан
kkk777kkk
Гость
« Ответ #7 : Март 02, 2010, 15:49 »

для примера запустил свою прожку, которая просто берет и рисует синус, при перетаскивании перерисовывается нормально, правда точки добавляются постоянно и после каждой виджету update()
Записан
ритт
Гость
« Ответ #8 : Март 02, 2010, 16:37 »

я не намекал на кривость. я лишь говорил о том, что это - известная проблема.
но как я сам с ней боролся уже не помню...
Записан
Mityai
Гость
« Ответ #9 : Март 02, 2010, 16:43 »

2 Константин:
А хоть в каком направлении копать? Попробовать у нас на форуме или нужны более глобальные поиски вариантов работы с оконными приложениями Виндоуз в целом, не только для Qt?
Записан
ритт
Гость
« Ответ #10 : Март 02, 2010, 18:04 »

здесь точно что-то подобное обсуждалось (в первой ветке, наверное). а так - гугль, яндех и т.п.
Записан
Mityai
Гость
« Ответ #11 : Март 03, 2010, 09:26 »

Всем спасибо за помощь! Если вспомнится что-то новое, пишите. Если найду решение сам, тоже отпишусь!
Записан
Mityai
Гость
« Ответ #12 : Апрель 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? Или он все-таки распространяется исключительно на клиентскую часть окна и никак это не изменить? Камрады, слово за вами...
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Апрель 07, 2010, 14:46 »

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

проверил сейчас у себя, запустил в параллельном потоке в фоне вывод в один из доков, который лежит в главном окне, и начал все приложение таскать - внимание - параллельно работающая нить QThread останавливается, как только берусь за рамку главного окна, не важно, с какой целью - перемещать или изменять масштаб

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

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

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.133 секунд. Запросов: 23.