Форум программистов, компьютерный форум CyberForum.ru

Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? - C++

Восстановить пароль Регистрация
 
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.10.2011, 22:07     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #1
Консольная программа.
Например, рассмотрит игру "змейка".
В этой игре одновременно змейка ползет и ждет данные от клавиатуры. Но если написать cin >> data, то ведь вся программа остановится, пока значение не будет введено и змейка в это время перестанет ползти.
Как это реализовать?
В WinAPI это понятно как сделать, ибо там ожидание данных не прерывает программу. А вот с консолью не понятно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2011, 22:07     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как?
Посмотрите здесь:

C++ Консольная программа
C++ Консольная программа...
C++ Почему не работает консольная программа.
C++ Послав команду функцией system() программа ждет дополнительных данных
Программа ждет ввода числа и в зависимости от количества цифр в числе выдает сообщение об их разрядности: трехзначное, пятизначное и т.д C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
14.10.2011, 22:35     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #2
CreateThread ,благо есть мнагозадачность

Добавлено через 7 минут
ну создаём поток а внём cin >>
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.10.2011, 22:39     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #3
эээ для змейки как раз потоки не нужны, там все спокойно делается через один поток.
getch + kbhit
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.10.2011, 22:43  [ТС]     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #4
Цитата Сообщение от Van111 Посмотреть сообщение
CreateThread ,благо есть мнагозадачность
Добавлено через 7 минут
ну создаём поток а внём cin >>
Про это думал, но что-то сложно для змейки.
Цитата Сообщение от silentnuke Посмотреть сообщение
эээ для змейки как раз потоки не нужны, там все спокойно делается через один поток.
getch + kbhit
То, что надо.
kbhit( conio.h) - это вроде от Си. Есть что-нибудь для C++?
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.10.2011, 22:48     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #5
Цитата Сообщение от Chelioss Посмотреть сообщение
Про это думал, но что-то сложно для змейки.

То, что надо.
kbhit( conio.h) - это вроде от Си. Есть что-нибудь для C++?
в с++ прекрасно будет работать.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.10.2011, 22:53  [ТС]     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #6
Цитата Сообщение от silentnuke Посмотреть сообщение
в с++ прекрасно будет работать.
Знаю. Буду использовать. Но я хочу узнать аналог для С++, ибо я хочу в программах на С++ пользоваться инструментами из С++.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
16.10.2011, 03:06  [ТС]     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #7
Допустим, я использую kbhit и каждую секунду проверяю на ввод. Но мне надо только первый символ взять, а остальные убрать из потока(очистить вес поток), чтобы в следующий раз, когда я снова буду проверять на ввод, оставшиеся символы не попали ко мне. Как это сделать?
C++
1
2
3
4
5
6
7
8
while( true )
{
    if( kbhit )
    {
          value = getch();
          // как остальные символы убрать из потока или отчистить весь поток?
    } 
}
и как распознать нажатие стрелок на клавиатуре?
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
16.10.2011, 03:25     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while(1)
{
    while(!kbhit())
    {   
        //тут перерисовка, проверка не проиграли ли и прочее
    }
    int c=_getch();
    if(c==0||c==24)
        c=_getch();
    switch (c)
    {
        //обрабатываем нажатие
    }
}
для змейки примерно так сойдет
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.10.2011, 05:35     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #9
Chelioss, по моему это как раз тот случай когда пренебрегать api не стоит. зачем велик, если есть хуки, которые специально для этих целей и созданы. А если конкретно о змейке, то наверное надо же как-то ограничить время рисования следующего звена, правильно? иначе никому и не хватит просто времени нажать клавишу как игра закончится. А в этом случае без таймера никак не обойтись.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2011, 13:41     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как?
Еще ссылки по теме:

C++ Консольная программа тестирования [работа с текстовыми файлами]
C++ Программа не работает как надо. Задача: Вывести сумму всех элементов массива, кратных данному числу К (вводится с клавиатуры)
C++ Консольная программа которая работает с двумя файлами

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

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
16.10.2011, 13:41  [ТС]     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как? #10
Цитата Сообщение от alkagolik Посмотреть сообщение
Chelioss, по моему это как раз тот случай когда пренебрегать api не стоит. зачем велик, если есть хуки, которые специально для этих целей и созданы. А если конкретно о змейке, то наверное надо же как-то ограничить время рисования следующего звена, правильно? иначе никому и не хватит просто времени нажать клавишу как игра закончится. А в этом случае без таймера никак не обойтись.
Я буду использовать функцию Sleep(). Как только время пройдет, я считываю данные с клавиатуры, двигаю змейку на 1 пункт вперед, потом перерисовываю игровое поле.
Yandex
Объявления
16.10.2011, 13:41     Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как?
Ответ Создать тему
Опции темы

Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru