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

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

11.10.2025, 19:23. Показов 3041. Ответов 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
Сообщений: 216
24.10.2025, 14:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kapbepucm Посмотреть сообщение
А Вы уверены что правильно считаете время отрисовки кадра?
Уверен. Совершенно не важно в каком месте renderNow считать время (если это место всегда одно и то же). Т. к. renderNow работает циклически. Это в любом случае будет период цикла. Не учли текущую swapBuffers - зато учли предыдущую. Можете сами проверить.

Цитата Сообщение от kapbepucm Посмотреть сообщение
порядок обработки событий в Qt не идёт строго по их поступлению, чтото может, взависимости от приоритетов, выполнится раньше или пожже
А можно ли как-то задать приоритеты для событий?
0
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,437
24.10.2025, 16:22
Я скомпилировал приложенный вариант, у меня вообще нет реакции на мышь. Серый круг ходит слева направо и обратно.
На кнопки "Стрелка вверх/вниз/влевов/право" реагирует изменением размера.
Также в левом верхем углу есть строки
render: 16ms
frame: 16ms
Если не нажимать клавиши, то render: 0ms.
Вложения
Тип файла: zip events1.zip (5.9 Кб, 3 просмотров)
0
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,437
24.10.2025, 18:31
Задержка есть, причину ещё не искал.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
25.10.2025, 12:54  [ТС]
Цитата Сообщение от peter_irich Посмотреть сообщение
у меня вообще нет реакции на мышь
Пример про клавиатуру, я же написал.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
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
Сообщений: 216
26.10.2025, 01:01  [ТС]
SmallEvil, processEvents() уже пробовал. Вызывает непонятные краши. Кроме того, не рекомендуется самими авторами Кьюти.

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

А чем тебе плоха "архитектура событий" в моём почти тривиальном примере? Предложи тогда хорошую
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
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
Сообщений: 216
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
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,437
26.10.2025, 17:20
Я запустил ещё раз - задержка происходит после использования клавиш "Вверх/Вниз". когда движется тёмно-зелёный прямоугольник.
При запущенном "Systrem monitor" видно, что его перерисовка загружает процессор.
Светло-серый круг совершенно не загружает, ни при движении, ни при изменении размера.
Вложения
Тип файла: zip events2.zip (11.7 Кб, 3 просмотров)
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
26.10.2025, 18:02  [ТС]
peter_irich, не надо тут это писать. Лучше что-нибудь полезное напиши.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2025, 18:06
Цитата Сообщение от Geek Geekson Посмотреть сообщение
что-нибудь полезное напиши
Давай попробуем один exe на разных системах.
Я не вижу у себя задержки, по крайней мере по своим критериям.
Может эксперт увидит.
Вложения
Тип файла: zip deploy.zip (11.24 Мб, 6 просмотров)
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
26.10.2025, 23:12  [ТС]
SmallEvil, та же задержка.

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

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
И я убрал метод kepressed
Обработка событий клавиатуры был перенесен в event.
Но это, опять же, некритично.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
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
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru