0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 2

Пауза и возобновление работы по нажатию клавиши

05.08.2016, 01:40. Показов 2750. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Необходимо реализовать паузу в цикле при нажатии на клавишу и продолжение программы при повторном нажатии, при этом не должно быть ожидания ввода наподобие getchar, getc и т.д.
Пробовал аналог kbhit(): http://cboard.cprogramming.com... linux.html
Только он "срабатывает" один раз, то есть встает вопрос об очистке буфера клавиатуры.
Терминал линукса.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.08.2016, 01:40
Ответы с готовыми решениями:

Пауза/возобновление работы потока
драсте подскажите как сделать шоб поток в определеном месте остановился а в нужный момент команда с основнова процеса сняла этот поток с...

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

Пауза и возобновление загрузки
Как реализовать паузу и возобновление загрузки IdHttp.Get ?

4
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,560
05.08.2016, 02:00
Ну многопоточность надо рассмотреть. Один поток работает, второй ждёт клавишу. Как дождётся, блокирует первый поток каким-либо образом. Второй раз дождётся - разблокирует.
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
05.08.2016, 07:49
Fandia, Так в Вашем примере написано
C++
1
2
3
 if ( kbhit())
        {
            c = getch(); // считывание символа.
Буфера в низкоуровневом вводе нет.
Только надо учесть, что управляющие клавиши посылают 2 символа
C++
1
2
3
4
5
 if ( kbhit())
        {
            c = getch(); // считывание символа.
            if(c==224)
               c = getch(); // считывание 2 символа.
0
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,560
05.08.2016, 10:25
Сделал через потоки так:
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
#include <boost\thread.hpp>
#include <iostream>
 
bool work = true;
boost::condition_variable work_cv;
boost::mutex work_mut;
bool ready = false;
 
void key_control()
{
    while (true)
    {
        std::cin.get();
        std::cin.clear();
        if (work)
        {
            work = false;
        } else
        {
            work = true;
            {
                boost::lock_guard<boost::mutex> lock(work_mut);
                ready = true;
            }
            work_cv.notify_one();
        }
    }
}
 
int main()
{
    boost::thread key_control_thread(key_control);
    key_control_thread.detach();
 
    while (true)
    {
        if (work)
        {
            std::cout << '.';
            boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
        } else
        {
            boost::unique_lock<boost::mutex> lock(work_mut);
            while (!ready)
                work_cv.wait(lock);
            ready = false;
        }
    }
    return 0;
}
Использовал boost так как нет С++11 компилятора. Ну и флаг work по хорошему надо атомарным сделать.

Добавлено через 23 секунды
Да, реагирует только на Enter.
1
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 2
06.08.2016, 01:42  [ТС]
zss, не, там люди ниже отписывались.
John Prick, большое спасибо за реализацию Правда я совсем не разбираюсь в потоках. Не совсем ясно где происходит основной рабочий поток и какой отведен под отлавливание нажатий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2016, 01:42
Помогаю со студенческими работами здесь

Многопоточность. Пауза и Возобновление потока
Вот мои эксперименты с потоками в Java! Пауза потока работает, но поток не хочет возобновляться main.java package main; public...

Потоки в Delphi7. Остановка, пауза, возобновление
Ребят, нужна помощь новичку в Delphi Создала поток, но команды &quot;Остановить поток&quot;, &quot;Пауза&quot; и &quot;Возобновление&quot; не...

Пауза на 7 секунд или пауза до нажатия клавиши
Для загрузчика надо сделать паузу, длящуюся 7 секунд, во время которой, если пользователь нажмет клавишу, происходит выход из паузы, или...

Завершение цикла и его возобновление по нажатию кнопки
Добрый день. Нужна ваша помощь Нужно запустить бесконечный цикл repeat ... until false; , но по нажатию определенной кнопки нужно...

Прекращение и возобновление ввода по нажатию определенных клавиш
.model tiny .code org 100h begin: mov ax,0003h int 10h call ramka


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru