Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213

Qt с задержкой реагирует на клавиатуру и мышь

11.10.2025, 19:23. Показов 2222. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В простом проекте без нагрузки сделал QWindow, рядом с позицией курсора (QCursor::pos()) рисуется фигура. Её реакция отстаёт от курсора на целых 3 кадра. А реакция на keyPressEvent вообще 5 кадров. Причём рисование окна идёт с ускорением OpenGL. Отключение vsync задержку не убирало, только делало короче по времени (из-за того что сам кадр стал короче), но если мерить в кадрах - она даже длиннее становилась - 5 кадров вместо 3. Можно ли средствами Qt убрать эту тормознутость, или спасение только в winapi?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2025, 19:23
Ответы с готовыми решениями:

Qt Creator не реагирует на события мышки и нажатия клавишь
Здравствуйте форумчане. Установлен Qt Creator последней версии на Ubuntu 14.04 Mate. Однажды...

QFileSystemWatcher не реагирует на изменения в общей папке сети
Имеется школьная локальная сеть. Я сделал программу, которая следит за изменениями в папке с...

Creator не реагирует на изменения в коде и запускает старый проект
Когда я коменчу части кода, он прям по комментариям идет, если удаляю их, то все удаленное...

45
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
24.10.2025, 14:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kapbepucm Посмотреть сообщение
А Вы уверены что правильно считаете время отрисовки кадра?
Уверен. Совершенно не важно в каком месте renderNow считать время (если это место всегда одно и то же). Т. к. renderNow работает циклически. Это в любом случае будет период цикла. Не учли текущую swapBuffers - зато учли предыдущую. Можете сами проверить.

Цитата Сообщение от kapbepucm Посмотреть сообщение
порядок обработки событий в Qt не идёт строго по их поступлению, чтото может, взависимости от приоритетов, выполнится раньше или пожже
А можно ли как-то задать приоритеты для событий?
0
 Аватар для peter_irich
362 / 216 / 53
Регистрация: 18.10.2017
Сообщений: 2,337
24.10.2025, 16:22
Я скомпилировал приложенный вариант, у меня вообще нет реакции на мышь. Серый круг ходит слева направо и обратно.
На кнопки "Стрелка вверх/вниз/влевов/право" реагирует изменением размера.
Также в левом верхем углу есть строки
render: 16ms
frame: 16ms
Если не нажимать клавиши, то render: 0ms.
Вложения
Тип файла: zip events1.zip (5.9 Кб, 3 просмотров)
0
 Аватар для peter_irich
362 / 216 / 53
Регистрация: 18.10.2017
Сообщений: 2,337
24.10.2025, 18:31
Задержка есть, причину ещё не искал.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
25.10.2025, 12:54  [ТС]
Цитата Сообщение от peter_irich Посмотреть сообщение
у меня вообще нет реакции на мышь
Пример про клавиатуру, я же написал.
0
Заблокирован
25.10.2025, 15:44
Цитата Сообщение от Geek Geekson Посмотреть сообщение
А крутой и современный Qt еле ворочает ластами.
Тут нужно в корень смотреть. А это много часов.
Про всю иерархию и систему сообщений Qt. Начиная с QCoreApplication.
Как костыль, куда его правильно вставить в такой, довольно плохой архитектуре событий как в твоем примере, я хз:
C++
1
2
3
    painter.end();
    m_context->swapBuffers(this);
    qApp->processEvents(); // <---
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
26.10.2025, 01:01  [ТС]
SmallEvil, processEvents() уже пробовал. Вызывает непонятные краши. Кроме того, не рекомендуется самими авторами Кьюти.

И "корень" тут я хз где, потому что, как уже писал, даже прямой асинхронный вызов клавиши из WinAPI (т. е. в обход всего механизма Кьюти) никак на задержку не влиял.

А чем тебе плоха "архитектура событий" в моём почти тривиальном примере? Предложи тогда хорошую
0
Заблокирован
26.10.2025, 01:59
Цитата Сообщение от Geek Geekson Посмотреть сообщение
processEvents() уже пробовал. Вызывает непонятные краши. Кроме того, не рекомендуется самими авторами Кьюти.
Почему у меня не крешится?
Хотя да, такое ощущение что может быть рекурсия.
Хоть я её и не вижу.

Цитата Сообщение от Geek Geekson Посмотреть сообщение
И "корень" тут я хз где, потому что, как уже писал, даже прямой асинхронный вызов клавиши из WinAPI (т. е. в обход всего механизма Кьюти) никак на задержку не влиял.
Нужен переводчик.

Цитата Сообщение от Geek Geekson Посмотреть сообщение
А чем тебе плоха "архитектура событий" в моём почти тривиальном примере?
Таймер забивающий всё и вся.

Цитата Сообщение от Geek Geekson Посмотреть сообщение
Предложи тогда хорошую
Что именно должно происходить?
Для твоего случая у Qt припасено спец. случай для таймера.
C++
1
    apptimer -> start(0);
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
26.10.2025, 16:47  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Нужен переводчик
Нажатия клавиш получал не в keyPressEvent, а вызывая GetAsyncKeyState из WinAPI, прямо перед отрисовкой. Выше всё писал же.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Таймер забивающий всё и вся
Насколько знаю, сигналы эти нигде не копятся. Вот из доков:

All timer types may time out later than expected if the system is busy or unable to provide the requested accuracy. In such a case of timeout overrun, Qt will emit timeout() only once, even if multiple timeouts have expired, and then will resume the original interval.
Т. е. если был очередной сигнал таймаута (или несколько) - слот, присоединённый к нему, будет вызван снова один раз (как только поток до него дойдёт). Всё. И вообще такой способ анимации по таймеру - везде и рекомендуется. Вон в примерах глянь (collidingmice например).

Цитата Сообщение от SmallEvil Посмотреть сообщение
apptimer -> start(0);
Попробовал - всё так же.

Добавлено через 2 часа 30 минут
Интересно. Поставил таймеру период большой, например apptimer -> start(250) - тогда действительно та задержка пропадает. И реакция идёт через 1 кадр. И только если сильно увеличивать нагрузку (так что её рисование занимает дольше 250 мс) - тогда 4-кадровая задержка появляется. Значит действительно таймер забивает события клавиатуры (хотя по докам не должен).

Тогда по идее надо сделать этот таймер single shot, и в конце renderNow запускать его снова (с ненулевым периодом).

Попробовал - и нифига, всё та же задержка. Хотя по идее уже ничто не забивает события. И как быть тогда? Как тогда обеспечить цикличность renderNow с высокой частотой (ограниченной только скоростью рендеринга), но чтобы между её вызовами обрабатывались все события?
0
26.10.2025, 16:49

Не по теме:

Цитата Сообщение от Geek Geekson Посмотреть сообщение
И как быть тогда?
Покупать глобус плоской Земли.

0
 Аватар для peter_irich
362 / 216 / 53
Регистрация: 18.10.2017
Сообщений: 2,337
26.10.2025, 17:20
Я запустил ещё раз - задержка происходит после использования клавиш "Вверх/Вниз". когда движется тёмно-зелёный прямоугольник.
При запущенном "Systrem monitor" видно, что его перерисовка загружает процессор.
Светло-серый круг совершенно не загружает, ни при движении, ни при изменении размера.
Вложения
Тип файла: zip events2.zip (11.7 Кб, 3 просмотров)
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
26.10.2025, 18:02  [ТС]
peter_irich, не надо тут это писать. Лучше что-нибудь полезное напиши.
0
Заблокирован
26.10.2025, 18:06
Цитата Сообщение от Geek Geekson Посмотреть сообщение
что-нибудь полезное напиши
Давай попробуем один exe на разных системах.
Я не вижу у себя задержки, по крайней мере по своим критериям.
Может эксперт увидит.
Вложения
Тип файла: zip deploy.zip (11.24 Мб, 6 просмотров)
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
26.10.2025, 23:12  [ТС]
SmallEvil, та же задержка.

Добавлено через 1 час 44 минуты
SmallEvil, у тебя значение "frame" сколько мс показывало когда ты проверял?

У себя тестил на 2 разных машинах (и свои тоже) - на обеих та же задержка.
0
Заблокирован
26.10.2025, 23:36
Цитата Сообщение от Geek Geekson Посмотреть сообщение
у тебя значение "frame" сколько мс показывало когда ты проверял?
Это с start(0). Та самая сборка.
Но какая разница? На таймерах толкового игрового цикла не получишь.
Миниатюры
Qt с задержкой реагирует на клавиатуру и мышь  
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
26.10.2025, 23:55  [ТС]
SmallEvil, я уже сделал и совсем без таймера, вызывая requestUpdate() в конце отрисовки, и перехватывая QEvent::UpdateRequest - как в доках написано. Всё ровно так же, хоть тресни. Clean в проекте делал.

Добавлено через 5 минут
SmallEvil, у тебя на скрине frame показывает 1744 мс. И хочешь сказать что реакция программы на нажатие у тебя также следует примерно через 1,7 с? У меня при таких условиях - только через 7 - 8 с.
0
Модератор
Эксперт Java
 Аватар для alecss131
2835 / 1344 / 403
Регистрация: 11.08.2017
Сообщений: 4,291
Записей в блоге: 2
27.10.2025, 15:59
Цитата Сообщение от Geek Geekson Посмотреть сообщение
с ускорением OpenGL
Ну как минимум это дает задержку. Если двойная буферизация, то в 1 кадр, если тройная, то в 2 кадра. Конечно можно использовать всего 1 буфер, но тогда будут артефакты при рисовании.
Еще не известно как под капотом Qt все это рисует, там может не в 1 проход, а так же с промежуточными буферами/текстурами.
0
Заблокирован
27.10.2025, 18:50
И ещё с этими таймерами, зависит от аппаратной составляющей, драйверов и ОС.
Как видим, один и тот же код ведет себя немного по разному на разных машинах/ОС.

И ещё одно, на счет такого ввода.
Какой практический смысл?

Ведь естественно что когда происходит долгий рендеринг то нет никакой гарантии получения других сообщений.
То что QT где то там хранит небольшую очередь ввода от мыши/клавиатуры, это, ну такое себе.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
27.10.2025, 19:25  [ТС]
SmallEvil, ответь пожалуйста:

Цитата Сообщение от Geek Geekson Посмотреть сообщение
у тебя на скрине frame показывает 1744 мс. При этом, через сколько у тебя следует реакция программы на нажатие? Также примерно через 1,7 с или дольше? У меня при таких условиях - только через 7 - 8 с.
0
Заблокирован
27.10.2025, 19:48
Цитата Сообщение от Geek Geekson Посмотреть сообщение
ответь пожалуйста
Да.
Там где много похожих значений, там было нажато быстро много ESC.
Могу видео сделать.
Код был модифицирован не критично.
Старт таймера с аргументом 0. И я убрал метод kepressed, так как ты уже event переопределил.
Просто было пару экспериментов.

Добавлено через 2 минуты
Windows 10 x64, двухлетний бюджетный ноут с SSD, со встроенной видяхой.
Отключены фаерволы дефендоры ОС(чистое зло).

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
И я убрал метод kepressed
Обработка событий клавиатуры был перенесен в event.
Но это, опять же, некритично.
0
Заблокирован
27.10.2025, 19:51
Прикрепил исходники, толку от них будет ноль, мы уже всё выяснили бинарниками.
Вложения
Тип файла: zip events.zip (2.5 Кб, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2025, 19:51
Помогаю со студенческими работами здесь

QtCreator не реагирует на изменение файлов формы
QtCreator не реагирует на изменение файлов формы, а именно не меняется текст и не изменяется размер...

KeyPressEvent не реагирует на нажатия стрелок
собственно говоря, обрабатываю события клавиш, всё кроме стрелок нормально выводится в qDebug()&lt;&lt;...

Кнопка не реагирует на нажатие
В виджете создаю кнопку, при нажатии на которую вызывается другой виджет, определенный в dll. В...

Слот не реагирует на сигнал
Всем привет! Пишу простенький конвертор едениц времени: В файле mainwindow.h я создаю...

Слот не реагирует
Уважаемые форумчане! Программа проста донельзя, пользователь вводит имя и жмёт кнопку. Цикл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru