Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
1

Беспрерывный ввод

11.05.2018, 17:53. Показов 2026. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, я делал простенький чат в консоли для локальной сети. Я его уже сделал, но мне стало интересно, можно ли сделать, как в обычном приложении, чтобы чат обновлялся без участия пользователя. Максимум, чего я смог достичь, так это использовать _getch(). Может кто знает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2018, 17:53
Ответы с готовыми решениями:

беспрерывный цикл
подскажите,где ошибка?? Нужно чтобы вызывался R-Y-G-Y-R и т.д void Traffic_Light::processing()...

Как правильно заменить ввод данных простой на ввод с клавиатуры?
#include "stdafx.h" #include <cstdlib> #include <iostream> using namespace std; int...

Ввод через пробел. Как остановить ввод. while(cin >> input)
Здравствуйте. Начну с условия задания. Ввести к-во элементов массива. Заполнить массив....

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран?...

20
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
11.05.2018, 17:57 2
Обновляй его каждый раз, как приходит туда сообщение
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
11.05.2018, 18:01  [ТС] 3
SuperKir, а что, если не вводить ничего, можно ли, чтобы цикл пролетал мимо std::cin.getline?

Добавлено через 46 секунд
Хотя так вряд ли, это же прерывание, его не пропустить, кроме как сделать, что хочет прога.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
11.05.2018, 18:04 4
pavel2210057, кидай код, я не понимаю, о чем ты говоришь
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
11.05.2018, 18:08  [ТС] 5
SuperKir, что здесь не понимать, вот вы в ВКонтакте переписываетесь когда, у вас сообщения собеседника появляются в реальном времени, вот и я так хочу.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
11.05.2018, 18:51 6
pavel2210057, как только клиент получает событие "сообщение" обновлять чат - что тогда здесь не понятно?

Цитата Сообщение от pavel2210057 Посмотреть сообщение
что, если не вводить ничего, можно ли, чтобы цикл пролетал мимо std::cin.getline?
То что тут написано - какой-то бред.
Цитата Сообщение от pavel2210057 Посмотреть сообщение
Хотя так вряд ли, это же прерывание, его не пропустить, кроме как сделать, что хочет прога.
Ты понимаешь, что такое прерывание? И прога делает ровно то - что ей скажет тот, кто ее программирует.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
11.05.2018, 19:32 7
Посмотрите в curses, там есть проверка нажатия клавиш, не блокирующая работу программы.
Еще можно разделить программу на два потока: один будет слушать интернет и выводить на экран текст, а второй считывать ввод пользователя. И вот этот второй пусть блокируется если хочет.
Но вариант с curses конечно менее костыльный.
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
11.05.2018, 19:39  [ТС] 8
Цитата Сообщение от SuperKir Посмотреть сообщение
как только клиент получает событие "сообщение"
Я не знаю, как сделать так, чтобы программа отреагировала на изменение буфера сообщений. У меня сама суть в том, что есть некий файл, содержащий информацию (типа сервер), и он раскидывает информацию из этого файла участникам чата (типа клиентам), я в суть сетей не вникал, но думаю тут и не надо.
Цитата Сообщение от SuperKir Посмотреть сообщение
То что тут написано - какой-то бред.
Я лишь сказал, что сделал ввод текста в чат с помощью getline, и спросил, можно ли как-нибудь пропустить этап ввода, повторюсь, самое лучшее, что я нашел - использовать _getch(). Сделал так, чтобы при нажатии на 'q', начинался ввод сообщения. Если вы знаете как лучше, помогите.
Цитата Сообщение от SuperKir Посмотреть сообщение
Ты понимаешь, что такое прерывание?
Да, но здесь я употребил это слово в другом смысле. Я имел ввиду, что программа прерывается на ввод сообщения, хотя в неком смысле это можно сравнить с int 16h в ассемблере, то есть прерывание на ввод с клавиатуры.
Цитата Сообщение от SuperKir Посмотреть сообщение
И прога делает ровно то - что ей скажет тот, кто ее программирует.
А здесь вы будто пытаетесь меня подколоть. Я лишь хочу узнать как выполнить эту задачу, а вы сразу начинаете.

Добавлено через 1 минуту
COKPOWEHEU, у меня даже интернет не учавствует, я чисто делаю чат для локальной сети.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
11.05.2018, 23:57 9
pavel2210057, как ты себе вообще представляешь чат в консоли, который будет в режиме "реального времени" обновлять тебе сообщения? Вот допустим ты начал печатать, а "кто-то там" отправил тебе сообщение, куда оно "вставится"?

Как вариант, использовать разные консоли для отправки/получения.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
12.05.2018, 02:05 10
Цитата Сообщение от pavel2210057 Посмотреть сообщение
COKPOWEHEU, у меня даже интернет не учавствует, я чисто делаю чат для локальной сети.
Как будто так велика разница - локальная сеть, глобальная. Не цепляйтесь к словам. Решение я предложил, вам осталось побольше по этой теме прочитать и применить у себя.
Цитата Сообщение от SuperKir Посмотреть сообщение
pavel2210057, как ты себе вообще представляешь чат в консоли, который будет в режиме "реального времени" обновлять тебе сообщения?
В принципе вполне реально, примерно так же сделаны игры в текстовом режиме: сообщения с клавиатуры считываются без вывода на дисплей, а потом сама программа определяет где ей что рисовать. Где область ввода, а где лог чатика.
Теоретически, для этого применяются ESC-последовательности и переключение терминала для прямой работы (raw input), но они свои для каждой разновидности. Для унификации и придумали библиотеку curses.
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
12.05.2018, 05:40  [ТС] 11
Я нашел способ. Оказалось, существует функция _kbhit(), которая возвращает true, если нажата клавиша какая-либо. Вот кусок кода.
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
51
52
53
54
55
56
57
58
59
60
61
    Server *client = new Server(username, chat_name);
    unsigned short frame_counter = 0;
    bool info_panel = false, connect = false, pause = false;
    String message;
 
    while (true) {
        if (!_kbhit()) {
            if (!info_panel && frame_counter >= 20000 && !pause) {
                system("cls");
                std::cout << "Вы вошли в чат '" << chat_name << "'! Чтобы посмотреть инфо, нажмите 'I'\n"
                             "Чтобы принять участие, дважды нажмите 'Q'\n";
                client->get_hystory();
 
                frame_counter = 0;
            }
 
            frame_counter++;
        }
        else {
            const char get_key = _getch();
 
            if ((get_key == 'q' || get_key == 'й') && !info_panel) {
                if (connect) {
                    std::cout << username << ": ";
                    std::cin.getline(message.my_string, 1024);
                    client->set(message);
                }
                else
                    std::cin.getline(message.my_string, 1024),
                    connect = true;
            }
            else if (get_key == 'i' || get_key == 'ш') {
                if (!info_panel) {
                    info_panel = true;
 
                    std::cout <<
                        "->ГОРЯЧИЕ КЛАВИШИ:\n"
                        "::q - начать ввод сообщения\n"
                        "::s - обновить ник\n"
                        "::u - приостановить обновления, повторное нажатие - обратное\n"
                        "::e - закрыть чат\n"
                        "->Чтобы закрыть инфо, нажмите 'I'";
                }
                else
                    info_panel = false;
            }
            else if ((get_key == 's' || get_key == 'ы') && !info_panel) {
                std::cout << "->Введите новый ник: ";
                std::cin >> username;
                client->swap_username(username);
                connect = false;
            }
            else if (get_key == 'u' || get_key == 'г')
                if (!pause)
                    pause = true;
                else
                    pause = false;
            else if (get_key == 'e' || get_key == 'у')
                break;
        }
    }
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
12.05.2018, 07:35 12
Цитата Сообщение от pavel2210057 Посмотреть сообщение
существует функция _kbhit()
Удачи с переносом на другие платформы или хотя бы другие компиляторы.
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
12.05.2018, 07:56  [ТС] 13
COKPOWEHEU, а есть варианты?
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
12.05.2018, 16:30 14
pavel2210057, уже минимум два раза назвал: curses

Добавлено через 32 минуты
Примитивная демка. Управление далеко не полное, с русским языком косяки, нет синхронизации со временем... Но концепцию поясняет.
Кликните здесь для просмотра всего текста
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
51
52
53
54
#include <stdlib.h>
#include <string.h>
#include <curses.h>
 
char lines[1000][10]={
  "line1",
  "line2",
  "line3",
  "line4",
  "line5",
  "line6",
  "line7",
  "line8",
  "line9",
  "line10"
};
 
void draw_lines(int line){
  int i;
  for(i=0; i<10; i++){
    move(i,0);
    printw("%c%s                          ", (i==line)?'>':' ', lines[i]);
  }
}
void update_str(char str[]){
  strcpy(lines[0], str);
}
 
int main(){
  initscr();
  start_color();  
  timeout(100);
  set_escdelay(0);
  keypad(stdscr, TRUE);
  cbreak();
  leaveok(stdscr,false);
  nonl();
  int key=0, i=0;
  char str[1024], *tmp = str;
  while(key!=27){
    key = getch();
    if(key < 255 && key > 0){tmp[0]=key; tmp++;}
    if(key == 13){
      tmp--; tmp[0]=0;
      update_str(str);
      tmp=str; str[0]=0;
      move(11,0); printw("                                      ");
    }
    draw_lines(i);
    move(11, tmp-str);
    if(i<10)i++; else i=0;
  }
  endwin();
}
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
12.05.2018, 18:03  [ТС] 15
COKPOWEHEU, я хотел написать без сторонних библиотек.

Добавлено через 52 секунды
COKPOWEHEU, есть ли варианты на чистом C++?

Добавлено через 1 минуту
Меня этот в принципе устраивает, я проверил на других компах с виндой - все работает, в чем проблема. А на кроссплатформинг я не замахивался.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
12.05.2018, 19:55 16
Цитата Сообщение от pavel2210057 Посмотреть сообщение
COKPOWEHEU, я хотел написать без сторонних библиотек.
Уж лучше сторонние общеизвестные библиотеки, чем ms-специфичные.
Цитата Сообщение от pavel2210057 Посмотреть сообщение
COKPOWEHEU, есть ли варианты на чистом C++?
Я уже писал вроде. Разновидностей терминалов куча, у каждого свой способ доступа. Лучше воспользоваться наработками других людей, чем реализовывать все эти варианты ручками. Хотя ради получения опыта можно и так.
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
12.05.2018, 20:00  [ТС] 17
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Лучше воспользоваться наработками других людей
Понимаете, эта программа не какой-либо оплачиваемый проект. Я ее делаю с одной целью - самообучение. В моем чате нет ни одного стороннего элемента. Я создал чистый проект и начал "творить". Поэтому какой мне смысл брать "наработки других людей", раз на то пошло, я бы с радостью изучил алгоритмы работы "curses".
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
13.05.2018, 09:46 18
Цитата Сообщение от pavel2210057 Посмотреть сообщение
какой мне смысл брать "наработки других людей"
Потому что они уже наработаны. А еще протестированы и отлажены значительно лучше, чем ваш велосипед.
Ну и именно по curses, оно обеспечивает легкую работу с цветом, окнами, позиционированием курсора и т.п. Если вы пишете чатик, нужно отображать лог, при этом не мешая вводу. Собственно, примерно это в моем примере реализовано.
0
14 / 14 / 8
Регистрация: 10.12.2015
Сообщений: 157
13.05.2018, 10:36 19
А разделить на два потока нельзя? Ну один читает сокет и отписывает если что то пришло, второй(главный) пишет в сокет. Захотели выйти читаете последний символ строки типа _q или _s(getline() - для этого подойдет), закрываете программу, или выходите в меню, при этом останавливаете слушание сокета на прием.

Я так думаю, что автор темы хочет обрабатывать два дела одновременно, читать и писать.

(я просто с консолью не работал, и не знаю как она будет работать в много поточном выводе )

Вообще делать велосипед интересно конечно, но библиотеки для того и созданы, чтобы ими пользовались(Независимо от того для чего вы это делаете).
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
13.05.2018, 15:05 20
Цитата Сообщение от wekfox Посмотреть сообщение
А разделить на два потока нельзя?
Теоретически можно, я этот вариант уже предлагал. Но у него куча недостатков: при выводе одним потоком текста, курсор ускачет к месту вывода. Но второй поток продолжает считать, что курсор не двигался. Какой текст при этом будет виден пользователю - вообще неизвестно. Кроме того, проблемы с синхронизацией потоков, решаемые, но все же.
0
13.05.2018, 15:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2018, 15:05
Помогаю со студенческими работами здесь

Ограничение на ввод символов (разрешить ввод только цифр)
Всем доброго времени суток! Я начал изучать С++ и у меня возник такой вопрос: Как ограничить...

Потоковый ввод и ввод данных. Работа с числами
Ввести с экрана два нат. числа. Найти частное первого на второе и определить, встречается ли среду...

Ввод в CEdit только символов 'A'B'C'D'E'F' и цифр от 0 до 9 (ввод в HEX)
собственно такой вопросик. как сделать так, что бы программа ругалась на некорректный ввод...

Что работает быстрее, ввод с консоли или ввод с файла?
вводятся множество списков программа удаляет первое число списка и удаляет все числа в этом списке...

Ввод с клавиатуры - требовать у пользователя ввод, пока он не будет корректным
Поискал в интернете и тут - не могу найти ответ на свой вопрос. Основная проблема - фильтровать...

Ввод целого положительного числа. Если вводится отрицательное число - повторить ввод
Организовать ввод целого положительного числа. Если вводится отрицательное число - заставить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru