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

Точная регистрация нажатий клавиш при тормозах в программе

16.09.2025, 13:54. Показов 1951. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотелось бы точно получать моменты нажатия клавиш, даже если программа тормозит (например, из-за тяжёлой отрисовки графики). События keyPressEvent конечно становятся в очередь, но если сравнить у них метки времени timestamp - видно что их регистрация происходит только между кадрами программы (то есть с задержками).

Вызовы QCoreApplication::processEvents() в нагруженных местах почти не улучшают точность регистрации, думаю из-за того что при отрисовке основные тормоза происходят на одном единственном вызове QOpenGLContext::swapBuffers.

Мне даже не нужно сразу обрабатывать эти события, нужно только чтобы они становились в очередь с точными метками времени. А обработка уже после отрисовки текущего кадра. Можно как-то сделать регистрацию точной? Наверное через отдельный поток как-то?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2025, 13:54
Ответы с готовыми решениями:

Отлавливание нажатий клавиш при неактивном(или свернутом) окне
Здравствуйте! Пишу программу подсчитывающую количество нажатий определенной кнопки(или их...

Что добавить в программу чтобы она показывала коды нажатых клавиш?
touchkeyboardactivity.cpp ///GNU GENERAL PUBLIC LICENSE Version 3 #include <sys/mman.h>...

Нажатие клавиш (движение объекта)
Реализую движение объекта(танк в игре),таким способом: void MvScene::keyPressEvent(QKeyEvent *...

31
110 / 74 / 6
Регистрация: 08.08.2025
Сообщений: 716
17.09.2025, 22:06
Студворк — интернет-сервис помощи студентам
jcxz,
Это обсудили уже.
Почитай выше, проблема не в этом, интересует другое
Цитата Сообщение от Geek Geekson Посмотреть сообщение
Мне даже не нужно сразу обрабатывать эти события, нужно только чтобы они становились в очередь с точными метками времени.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
17.09.2025, 22:52  [ТС]

Не по теме:

Цитата Сообщение от alecss131 Посмотреть сообщение
Да и рисовать не мз основного потока программы, особенно в Qt задачка не тривиальная, надо создавать зависимые контексты и кучу всего с помощью ОС специфичного кода.
Даже не верится. Такой крутой раскрученный фреймворк. А на деле - то виджеты текстовые жутко тормозные, то непонятки как в картинку рисовать на GPU, то с потоками гемор. Вспоминаю как легко создавал отдельные потоки на LabVIEW и всё работало как часы :) Но это конечно немного из другой оперы.



Добавлено через 9 минут
Цитата Сообщение от sdf45 Посмотреть сообщение
По сабжу (если я его правильно понял, а зачем это нужно - не представляю)
Ну например создаёшь ты игру, и хочется чтобы она максимально отзывчиво реагировала на кнопки. Если фпс стабильно высокий - улучшение конечно вряд ли заметишь (хотя задроты и не такое могут почувствовать ), но если фпс маловат, или просто в системе что-то лагнуло, затормозив отрисовку на секунду - обычно бывает противно когда видишь что на твои потуги комп вяло реагирует, со своими 16 ядрами. Хотя мог бы хоть нажатия кнопок нормально считать, это же быстро.

Немного помогает, но это не рекомендуется даже авторами Qt.
А где такое написано? В доках не видел.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
17.09.2025, 23:13
Цитата Сообщение от Geek Geekson Посмотреть сообщение
А где такое написано? В доках не видел.
Документация говорит в описании этого метода:
Use of this function is discouraged. Instead, prefer to move long operations out of the GUI thread into an auxiliary one and to completely avoid nested event loop processing. If event processing is really necessary, consider using QEventLoop instead.
Цитата Сообщение от Geek Geekson Посмотреть сообщение
Ну например создаёшь ты игру
Имхо, Qt (с++) не заточен под это (разве что OpenGl виджет есть)
Была неплохая задумка Qt3d, но сейчас развивают 2д, 3д на QML(там кстати на gpu) - это уже другая вселенная, тоже не особо подходит для создания игр.(снова же, имхо)
Хочешь писать игры-выбери какой нить игровой движок.
0
110 / 74 / 6
Регистрация: 08.08.2025
Сообщений: 716
17.09.2025, 23:25
По идее, событие можно на прерывание посадить, но это надо писать драйвер.
А если проще, надо менять код, разбавлять вставками для клавы.
Но про точность надо забыть, Вин не приспособлена для этого, это не реал-тайм ОС.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
17.09.2025, 23:37  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
Use of this function is discouraged. Instead, prefer to move long operations out of the GUI thread into an auxiliary one and to completely avoid nested event loop processing. If event processing is really necessary, consider using QEventLoop instead.
А, это онлайн. Во встроенных доках в креаторе (Qt 6.4.0) этого ещё нет

Цитата Сообщение от sdf45 Посмотреть сообщение
Хочешь писать игры-выбери какой нить игровой движок.
Ну игрулька простая и двухмерная. Чем конкретно какой-нибудь Unity будет для этого лучше?

Цитата Сообщение от a380 Посмотреть сообщение
А если проще, надо менять код, разбавлять вставками для клавы.
Но про точность надо забыть, Вин не приспособлена для этого, это не реал-тайм ОС.
Как менять-то? Конкретные идеи?
Винда не реал-тайм конечно, но и без этого можно качественно сделать.
0
110 / 74 / 6
Регистрация: 08.08.2025
Сообщений: 716
17.09.2025, 23:51
Geek Geekson,
Хз.
Я вот прогу написал, а как ее запустить ? Она просто ничего не делает. Ну такая специфичная, там не надо запускать код, в нем нет смысла, он для другого.
Мне сказали, поставь таймер и на него придумай событие.
И все заработало идеально.

А про чужой код никто ничего не скажет, думать надо самому.
0
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
18.09.2025, 00:04
Цитата Сообщение от Geek Geekson Посмотреть сообщение
Чем конкретно какой-нибудь Unity будет для этого лучше?
Ну как минимум они рассчитаны под игры, там уже есть и физика и обработка ввода, все силы разработчика направляются на игровую логику и дизайн.
А qt это больше про гуи, хотя на нем написан почти весь коммерческий 3д софт
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
18.09.2025, 00:18  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
А qt это больше про гуи
Но наверное не про текстовые виджеты
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.09.2025, 00:47
Цитата Сообщение от Geek Geekson Посмотреть сообщение
Ну игрулька простая и двухмерная. Чем конкретно какой-нибудь Unity будет для этого лучше?
Если получится сделать эту игрульку на Qt, не изобретая костыли и не тратя полжизни на воплощение функционала игрового движка - то ничем.
Про "текстовые виджеты" -там очень специфический случай - тяжеленная куча текста одной строкой без пробелов вроде бы, да? Как правило, в обычной ситуации, в 99% задач виджеты работают нормально.
0
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
18.09.2025, 11:04
Geek Geekson, Да и вообще, раз Вы написали что простая 2д игрушка, то спрашивается зачем такие заморочки с вводом? Зачем все так усложнять? Игры это не про усложнение, а наоборот про упрощение. Во всех играх ввода достаточно знать нажата ли кнопка на данный кадр (даже +- пара кадров ничего заметного не сделает, особенно на 60+ фпс). И еще как-то не вяжется тяжелая отрисовка графики и "простая двумерная игрулька".
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 216
18.09.2025, 16:32  [ТС]
alecss131, ну это на случай если у юзера слабая машина со встроенной графикой. А насчёт "ничего заметного за пару кадров" - не сказал бы так. Если игра динамичная и надо часто на рефлексах нажимать кнопки (и играть не под пиво) - вполне заметно, если есть с чем сравнить. Это и отличает всякие говняные поделки от качественных игр. Но морочиться с потоками ща действительно неохота. Наверное будет в следующей версии
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
19.09.2025, 22:33
Ради интереса, учитывая обсуждение выше - немного переделал свой пример - в цикле генерации пиксмапа(который работает в другом потоке) через определенные промежутки итерации кидаю сигнал в основной поток с gui, и по этому сигналу вызываю там processEvents() - в итоге вроде как лаги при перемещении итема на граф. сцене мышкой или клавой практически не ощущаются. Но я бы такое использовать наверное, не стал. Еще добавил задание приоритета для обоих потоков - разницы визуально нет при любых комбинациях - хз как это измерить. (Стоит добавить, что мой пример - не попытка решить сабж, а так, вариация на тему)
(зы и view->setCacheMode(QGraphicsView:: CacheBackground) случайно затесался после экспериментов- он там лишний.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2025, 22:33

Получить сочетание клавиш нажатых пользователем...
Добрый ! встала задача отобразить в QLineEdit сочетание клавиш нажатых пользователем, например...

Обработка одновременного нажатия клавиш клавиатуры
Мне необходимо написать примитивный "теннис" для двух игроков. Для начала я отрисовал две...

Класс для рисования прямоугольника, который движется по нажатию клавиш
собственно у меня есть класс, который описывает объект "ракетку" игры пинг понг. это просто...

Перемещение объекта нажатием клавиш
хедер #ifndef BULLET_H #define BULLET_H #include <QWidget> class Bullet : public QWidget {...

Обработка нажатия двух клавиш одновременно
нажатие одной какой то клавиши реализовал так bool MainWindow::event(QEvent *event){ if...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
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, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru