Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87

Прерывание бесконечного цикла нажатием горячей клавиши

07.01.2018, 18:18. Показов 3454. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такое дело: надо, чтобы при нажатии на кнопку начиналась функция и выполнялась до тех пор, пока не будет нажат эскейп.
Я пытаюсь реализовать это так, но ничего не получается: цикл оказывается бесконечным вне зависимости от нажатой эскейп.
Что я делаю не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int act = 1;
//~~~~~~~~~~~~~
int tree245(int ab)
{
        if(ab == 1)
        {
        SetCursorPos(193, 518);
        Sleep(tree091); 
        
 
        if(ab == 0)
         {
            tree245(0);
 
         }else{
             tree245(1);
         }
        }else{
            return 0;
        }
}
//~~~~~~~~~~~~
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    tree245(act);
}
//~~~~~~~~~~~~
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
 
         if(GetKeyState(VK_ESCAPE))
         {
         
            tree245(0);
            act = 0;
         }
}
Добавлено через 17 минут
Хочу сказать, что я взял немного не всю функцию ,хотя это и не важно. По сути, мышка должна перемещаться еще на одну точку

Добавлено через 4 часа 3 минуты
Ребят, ну помогите...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2018, 18:18
Ответы с готовыми решениями:

Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main()
Вкратце, в функции main() есть некий объект класса - scene, также есть бесконечно работающий цикл while(1), в котором вызывается...

Консоль. Завершение цикла нажатием клавиши
В консольной программе запускается бесконечный цикл. Необходимо организовать завершение цикла при нажатии любой клавиши(или какой-л...

Опрос кода клавиши для остановки бесконечного цикла
Доброй ночи. Курсовая работа на тему создания справочника по резисторам. Пытаюсь писать по кускам. фрагмент программы: ...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
07.01.2018, 18:25
Ничего, что у тебя рекурсия, из которой не так-то просто выйти? Переделай на итерацию (именно на цикл), и первое, что делай в цикле - это проверяй состояние переменной act. Если она = 0 - то выходи из функции.
1
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87
07.01.2018, 19:36  [ТС]
volvo, я что-то, кажется, не понял. Сделал так, но ничего не изменилось
C++
1
2
3
4
5
while(ab == 1)
        {
        SetCursorPos(193, 518);
        Sleep(tree091);
        }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
07.01.2018, 20:24
Для начала хочется понять, что делает эта функция, чтобы переписать ее без рекурсии.
1
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87
07.01.2018, 20:26  [ТС]
volvo, она перемещает курсор по экрану и жмет кнопку мыши
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
07.01.2018, 20:27
В цикл вставь вызов Application->ProcessMessages();
1
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87
07.01.2018, 20:34  [ТС]
Fulcrum_013, а что это? я вписал в конец, но ничего не произошло
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
07.01.2018, 21:30
Лучший ответ Сообщение было отмечено Jodi Redlot как решение

Решение

Куда именно вписал?

Добавлено через 2 минуты
Цитата Сообщение от Jodi Redlot Посмотреть сообщение
а что это?
Это вызов функции которая обрабатывает сообщения винды. Т.е. система работы ГУИ в билдере такая - TApplication получает сообщение и запускает событие его обработки. Пока оно полностью не завершилось следующее сообщение не обрабатывается. Поэтому если хочешь чтобы программа среагировала на что либо во время обработки сообщения надо вызвать Application->ProcessMessages

Добавлено через 3 минуты
Jodi Redlot,
кстати еще один способ - клаву можно асинхронно опрашиваешь через GetAsyncKeyState(VK_ESCAPE) прямо в цикле. не вызывая ProcessMessages. Это будет полный фриз всего приложения пока Esc не нажмешь
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2018, 21:30
Помогаю со студенческими работами здесь

Старый борланд: как выйти из бесконечного цикла по нажатию заданной клавиши?
Короче нужно сделать прогу которая считает сколько отрицательных,положительных,равных 0 ввел пользователь. Реализовал.Пользователь вводит...

Есть ли возможность реализовать прерывание цикла консольного приложения нажатием клавиши?
Выполняется цикл, при нажатии клавиши (например "А") цикл прерывается, но программа не закрывается. Приложение консольное

Вызвать программу из трея нажатием горячей клавиши
День добрый! Необходимо горячими клавиша вызывать программу из трея (нужно, потому что часто на день это необходимо, а мышью редко...

прерывание цикла нажатием кнопки
никак цикл не прерывается. почему-понять не могу function varargout = untitled(varargin) gui_Singleton = 1; gui_State =...

Прерывание бесконечного цикла
У меня есть код с бесконечным циклом. В этом коде долго происходят действия. Я хочу сделать проверку, если пока код выполнялся, в консоли...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru