powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
11 сообщений из 11, страница 1 из 1
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598627
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если у меня есть следующий цикл:
Код: plaintext
1.
2.
3.
4.
while (true) {
 // ...
 std::cout << "\r result = " << result;
}


Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?

Если сделать std::cin >> то тогда цикл остановится, а надо чтобы продолжался постоянно.
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598642
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Стандартными средствами С/С++ никак.
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598645
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, сори.
Есть же сигналы. Сигнал обрабатывай и выходи из цикла.
signal();

http://www.cplusplus.com/reference/csignal/signal/?kw=signal

Сигнал -- SIGINT
Клавиша будет C-c, в Win C-Break.
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598721
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++11 можно использовать штатный threads (в предыдущих стандартах - любую реализацию, хоть POSIX threads, хоть из Boost'а). Вот только для этого код придётся немного переписать (на поток, который что-то "бесконечно" крутит, и поток, проверяющий ввод-вывод и "выставляющий" признак останова либо "прибивающий" "бесконечный" процесс.).
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598722
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВася Уткин,

Стандартными средствами С/С++ никак.
в том смысле, что решение платформозависимо
там где нет _kbhit(), kbhit() - легко эмулируется
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598751
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivВася Уткин,

Стандартными средствами С/С++ никак.
в том смысле, что решение платформозависимо
там где нет _kbhit(), kbhit() - легко эмулируется

Ну, расскажи, как.
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598756
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИзопропилпропущено...

в том смысле, что решение платформозависимо
там где нет _kbhit(), kbhit() - легко эмулируется

Ну, расскажи, как.
Код: plaintext
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.
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int kbhit(void)
{
    struct termios oldt, newt;
    int ch;
    int oldf;
    
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
    
    ch = getchar();
    
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    fcntl(STDIN_FILENO, F_SETFL, oldf);
    if(ch != EOF)
    {
        ungetc(ch, stdin);
        return 1;
    }
    
    return 0;
}
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38598932
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

linux, работает:

Код: plaintext
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.
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int kbhit()
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);
  if(ch != EOF)
    {
      ungetc(ch, stdin);
      return 1;
    }

  return 0;
}

#define N 100
int a[N];

#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int kbhit(void)
{
    struct termios oldt, newt;
    int ch;
    int oldf;
    
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
    
    ch = getchar();
    
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    fcntl(STDIN_FILENO, F_SETFL, oldf);
    if(ch != EOF)
    {
        ungetc(ch, stdin);
        return 1;
    }
    
    return 0;
}
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38599564
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любители Borland
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38599568
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Че та я запострил такое странное ... Исправлю.
...
Рейтинг: 0 / 0
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
    #38599888
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин
По любой клавише стандартными средствам плюсов никак.
Но некоторыми можно.
Код: plaintext
1.
 void some_class::sig_hand(int n){ some_class::run=0; };


где-то в программе
Код: plaintext
1.
signal(SIGINT, some_class:sig_hand );


Код: plaintext
1.
2.
3.
4.
while (some_class::run) {
 // ...
 std::cout << "\r result = " << result;
}



По нажатию на CTRL+C будет выход из нафик.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]