![]() |
|
![]() ![]() ![]() |
|
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Добрый день, всем!
Наткнулся на такую особенность. При перетаскивании окошка(или изменении размеров) возврат управления processEvents происходит после завершения перетаскивания. В коде ниже можно наблюдать, как в консоле останавливается вывод циферок, когда окошко перетаскиваешь.
При этом ничего подобного не происходит, скажем, в консоле (cmd) или плеере lightalloy. |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
По-моему это стандартное поведение всех программ. Если передвигать окно, просто кликнуть на бордюр окна для изменения размера и держать мышку зажатой или открыть системное меню заголовка - все события останавливаются: таймеры, анимация, сообщения из сокетов и т.п. Другое дело, если это не стандартное окно, как у winamp или lightalloy - окно со шкуркой. Эти окна не рисуют пунктирный прямоугольник при перетаскивании, они двигаются вслед за мышкой, т.к. обрабатывают своё перемещение сами, а не полагаются на ОС. Поэтому в таких программах цикл событий как работал так и работает. Поэкспериментируй с флагом Qt::FramelessWindowHint, из-за отсутствия заголовка в подобных окнах тебе придется реализовывать перемещение и изменение размеров окна самому, что и сделано в программах типа LA.
|
|||
|
||||
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Нее. тут другое.
Если воткнуть таймер, то события от этого таймера обрабатываются. Видимо, когда перетаскиваешь окошко - начинают генерироваться много-много сообщений с новыми координатами, а функция processEvents возвращает управление, когда нет больше сообщений. Есть спец. опция
Но она не работает как ожидается. Опять же, при перетаскивании, выхода из неё не будет пока кнопку не отпустишь (==не закончится поток сообщений) |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Тут всего одного события хватает, чтобы processEvents() не вернулся - вызвать системное меню на заголовке окна и не закрывать его. События выполняются последовательно, если какой-то метод реагирует на событие и долго не возвращает управления, то остальные события будут ждать. Аналогично и обработчики таймера будут стоять, это всего лишь события.
|
|||
|
||||
iigor |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
crashtest.cpp
crashtest.h
main.cpp
данное приложение выводит в консоль сообщения вида "it 123" из main и "itS 456" благодаря таймеру. Если же нажать на системное меню - тогда сообщения "it 123" не появляются, но сообщения "itS 456" по прежнему выводятся, т.е. сообщения от таймера обрабатываются => цикл обработки не остановился. Или вы не про это? |
||||||
|
|||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Тогда я не понимаю какие еще эвенты могут быть в очереди при открытом системном меню, что невозможно вернуться из processEvents().
|
|||
|
||||
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
там QT что-то мутит
![]() Он запоминает некоторые состояния. И ждёт некоторых событий. (Я не очень силён в winapi, так что глубоко не понимаю этот код.) см. около if (!haveMessage)
|
|||
|
||||
iigor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Как мне объяснили, тот "баг", который я думал в qt, оказался в DispatchMessage(). т.е. внутри неё запускается некий дополнительный цикл и qt умеет с ним работать, поэтому нормально отрабатываются сообщения таймера.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |