Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 2

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

05.08.2016, 01:40. Показов 2769. Ответов 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
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.08.2016, 02:00
Ну многопоточность надо рассмотреть. Один поток работает, второй ждёт клавишу. Как дождётся, блокирует первый поток каким-либо образом. Второй раз дождётся - разблокирует.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
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
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
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
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru