Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.05.2022
Сообщений: 10

Прерывание бесконечного цикла на кнопку

07.04.2024, 19:59. Показов 1131. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий бесконечный цикл:
C
1
2
3
4
5
6
7
 do
  {
       if (...)
      {
          printf(...);
      }
  } while (?);
условие находящееся в if - бесконечное.
Какое условие нужно вложить в while чтобы была возможность выйти из цикла(на кнопку). Пробовал с помощью функции GetKeyState,но ничего не получилось.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2024, 19:59
Ответы с готовыми решениями:

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

Прерывание бесконечного цикла нажатием горячей клавиши
Такое дело: надо, чтобы при нажатии на кнопку начиналась функция и выполнялась до тех пор, пока не будет нажат эскейп. Я пытаюсь...

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

15
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
07.04.2024, 20:07
Просто добавь обработчики сигналов. Скажем, ctrl+d…
0
Модератор
Эксперт С++
 Аватар для zss
13766 / 10960 / 6490
Регистрация: 18.12.2011
Сообщений: 29,234
08.04.2024, 10:32
Если под кнопкой понимается клавиша клавиатуры, то
C
1
2
3
4
5
#include <conio.h>
do
{
....
} while (!kbhit());
0
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,310
14.04.2024, 18:58
ncurses на коленке

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#include <windows.h>
 
enum { KEY_ARROW = 0xe0, KEY_LEFT = 0x4b, KEY_UP = 0x48,
        KEY_DOWN = 0x50, KEY_RIGHT = 0x4d, KEY_ESC = 0x1b,
        SCRX = 80, SCRY = 24, MAX_SIZE = SCRX * SCRY };
 
char screen[MAX_SIZE];
HANDLE hStdout;
HANDLE hConsole;
 
void terminal_init (void);
void terminal_clear (void);
void terminal_mvprint (int, int, char *);
void terminal_refresh (void);
void terminal_quit (void);
int  terminal_getch (void);
void print_title (void);
 
int main (void) {
    terminal_init();
    print_title();
 
    char line[SCRX] = {0};
    for (int i = 0; i <= 100000; i++) {
        sprintf(line, "итерация цикла: %-6d", i);
        terminal_mvprint(1, 4, line);
        terminal_refresh();
 
        if (kbhit() && terminal_getch() == KEY_ESC)
            break;
    }
 
    sprintf(line, "Для продолжения нажмите любую клавишу . . . ");
    terminal_mvprint(SCRY - 1, 0, line);
    while( !kbhit() )
        terminal_refresh();
    terminal_quit();
    return 0;
}
// -------------------------------------------------------------
void terminal_init (void) {
    system("chcp 1251 > nul");
    terminal_clear();
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    hConsole = CreateConsoleScreenBuffer(
        GENERIC_READ | GENERIC_WRITE, 0,
        NULL, CONSOLE_TEXTMODE_BUFFER, NULL
    );
    SetConsoleActiveScreenBuffer(hConsole);
}
// -------------------------------------------------------------
void terminal_clear (void) {
    memset(screen, ' ', MAX_SIZE);
}
// -------------------------------------------------------------
void terminal_mvprint (int y, int x, char *str) {
    int line = y * SCRX;
    for (int i = 0; str[i] != '\0'; i++)
        screen[(line + x + i) % MAX_SIZE] = str[i];
}
// -------------------------------------------------------------
void terminal_refresh (void) {
    DWORD bw = 0;
    screen[MAX_SIZE - 1] = '\0';
    COORD coords = (COORD) {0, 0};
    WriteConsoleOutputCharacter(hConsole, screen, MAX_SIZE, coords, &bw);
}
// -------------------------------------------------------------
void terminal_quit (void) {
    terminal_clear();
    terminal_refresh();
    SetConsoleActiveScreenBuffer(hStdout);
}
// -------------------------------------------------------------
int terminal_getch (void) {
    int key = getch();
    return (key == KEY_ARROW)? getch() : key;
}
// -------------------------------------------------------------
void print_title (void) {
    char line[SCRX] = {0};
    sprintf(line, "Чтобы прервать цикл, нажмите ESC.");
    terminal_mvprint(SCRY - 1, 0, line);
    sprintf(line, "%8s: %3d", "строк", SCRY);
    terminal_mvprint(0, SCRX - strlen(line) - 1, line);
    sprintf(line, "%8s: %3d", "столбцов", SCRX);
    terminal_mvprint(1, SCRX - strlen(line) - 1, line);
}
// -------------------------------------------------------------
Миниатюры
Прерывание бесконечного цикла на кнопку  
2
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
14.04.2024, 23:18
stake-k26,
а к чему это всё?
Столько букоф...
1
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
14.04.2024, 23:25
Попробуйте GetAsyncKeyState: https://learn.microsoft.com/en... nckeystate.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
14.04.2024, 23:44
Моя классика.
Каждому своё.

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
#include <windows.h>
//---------------
#define KEYDOWN(vk_code)\
          ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) \
          ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
 
 
void SetPos(int x, int y)
{
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
 
 
int main()
{
    int i = 0;
    while (1) {
        if (KEYDOWN(VK_RETURN))break;
        Sleep(50);
        SetPos(10, 10); printf("%d %s", ++i, "<Press enter ?>");
    }
   
    return 0;
}
2
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
15.04.2024, 00:02
Макрос-то зачем?
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
15.04.2024, 00:15
Вот на си.
Кому winApi не нравиться.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <conio.h>
#pragma warning(disable:4996)
 
int main()
{
    char ch;
    while (1) {
 
        if (kbhit()) {
ch = getch();
        if (int(ch) == 27)
                break;
 
            printf("%s%c%s","\nKey pressed= ", ch," ==> Escape to exit" );
        }
    }
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от ksyrx Посмотреть сообщение
Макрос-то зачем?
Странный вопрос. Зелёный.... Что бы красивее было.
А зачем вообще макросы?
У меня был макрос.
Я его выделил мышкой и нажал копировать....

Добавлено через 4 минуты
Вот за этим...
C++
1
2
3
4
5
6
7
const short pos_x_channel{ 42 };// < --- Коорд X для отображ. второго столбца.(В знаках)    
    while (true) {
        short num_of_pos(1);
        while (!KEYDOWN('W') && !KEYDOWN('S') && !KEYDOWN(VK_SPACE) && !KEYDOWN('A') && !KEYDOWN('D') && !one)Sleep(8);
        if (KEYDOWN('W')) if (flag_pos > 1)--flag_pos;
        if (KEYDOWN('S')) if (flag_pos < mass_flt[0])++flag_pos;
        if (KEYDOWN(VK_SPACE))break;
Для особо одарённых...
1
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,310
16.04.2024, 17:39
Цитата Сообщение от Наталья8 Посмотреть сообщение
а к чему это всё?
Столько букоф...
Наталья8, да кто ж его знает, может все дело в скорости обновления терминала?
2
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
16.04.2024, 22:10
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
16.04.2024, 22:23
stake-k26,
Молодец конечно, но сложновато однако.
Курсор мешает.
Придумать куда его убирать.

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    int i = 0;
    while (1) {
        if (KEYDOWN(VK_RETURN))break;
            SetPos(10, 5); printf("%d %s", ++i, "<Press enter ?>"); SetPos(0, 0);
        Sleep(5);
    }
   
    return 0;
}
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
16.04.2024, 22:28

Да фигня. Дело техники.
Я как то не сильно напрягался.
Вопрос был про прерывание цикла, а не про вывод цифер...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
17.04.2024, 01:39
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <ncurses.h>
#include <stdio.h>
#include <unistd.h>
 
int main(void) {
    WINDOW * win = initscr();
    cbreak();
    nodelay(win, TRUE);
    int cnt = 0;
    
    printw("Press <Enter> for interrupt...\n");
    while ( getch() == EOF ) {
        printw("\rLoop #%d", ++cnt);
        sleep(1);
    }
    
    endwin();
    
    printf("\nInterrupted after %d loops.\n", --cnt);
    
    return 0;
}
0
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,843
Записей в блоге: 15
17.04.2024, 09:57
easybudda, можно и без ncurses, достаточно неблокирующий getch() использовать. Или даже простой read()...
0
17.04.2024, 10:43

Не по теме:

Прерывание на кнопку... Это на каком языке написано?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2024, 10:43
Помогаю со студенческими работами здесь

Прерывание бесконечного цикла по кнопке
Всем привет! Есть программа, по нажатию кнопки на форме запускается код, собирающий информацию с устройства, хочу сделать в ней...

Остановка бесконечного цикла нажатием на кнопку в окне программы
В окне программы две кнопки, одна запускает бесконечный цикл, другая должна его останавливать. Как это сделать, если после запуска...

Прерывание цикла while
Как сделать прерывание цикла (аргумент while), если прога не выводит какое-либо сообщения в командной строке? Просто прога создана для...

Прерывание цикла
нужно чтобы цикл начинался с начала, но при этом, чтобы объекты не разрушались. Смысл в том, что объекты не должны накладываться друг на...

Прерывание цикла for
Здравствуйте уважаемые форумчане. Можно ли как то прервать цикл for i Например у меня стоит for i = 0 to 1000 do begin мне нужно...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru