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


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

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

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

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

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

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

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

Ну, расскажи, как.
...
Рейтинг: 0 / 0
28.03.2014, 09:11
    #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
28.03.2014, 11:35
    #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
28.03.2014, 19:32
    #38599564
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
Любители Borland
...
Рейтинг: 0 / 0
28.03.2014, 19:47
    #38599568
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши?
MasterZiv,

Че та я запострил такое странное ... Исправлю.
...
Рейтинг: 0 / 0
29.03.2014, 18:09
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать, чтобы из бесконечного цикла можно было выйти по нажатию любой клавиши? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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