61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
|
|
1 | |
Беспрерывный ввод11.05.2018, 17:53. Показов 2026. Ответов 20
Метки нет (Все метки)
Привет, я делал простенький чат в консоли для локальной сети. Я его уже сделал, но мне стало интересно, можно ли сделать, как в обычном приложении, чтобы чат обновлялся без участия пользователя. Максимум, чего я смог достичь, так это использовать _getch(). Может кто знает?
0
|
11.05.2018, 17:53 | |
Ответы с готовыми решениями:
20
беспрерывный цикл Как правильно заменить ввод данных простой на ввод с клавиатуры? Ввод через пробел. Как остановить ввод. while(cin >> input) Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур |
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, как только клиент получает событие "сообщение" обновлять чат - что тогда здесь не понятно?
То что тут написано - какой-то бред. Ты понимаешь, что такое прерывание? И прога делает ровно то - что ей скажет тот, кто ее программирует.
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 |
Я не знаю, как сделать так, чтобы программа отреагировала на изменение буфера сообщений. У меня сама суть в том, что есть некий файл, содержащий информацию (типа сервер), и он раскидывает информацию из этого файла участникам чата (типа клиентам), я в суть сетей не вникал, но думаю тут и не надо.
Я лишь сказал, что сделал ввод текста в чат с помощью getline, и спросил, можно ли как-нибудь пропустить этап ввода, повторюсь, самое лучшее, что я нашел - использовать _getch(). Сделал так, чтобы при нажатии на 'q', начинался ввод сообщения. Если вы знаете как лучше, помогите. Да, но здесь я употребил это слово в другом смысле. Я имел ввиду, что программа прерывается на ввод сообщения, хотя в неком смысле это можно сравнить с int 16h в ассемблере, то есть прерывание на ввод с клавиатуры. А здесь вы будто пытаетесь меня подколоть. Я лишь хочу узнать как выполнить эту задачу, а вы сразу начинаете. Добавлено через 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 |
Как будто так велика разница - локальная сеть, глобальная. Не цепляйтесь к словам. Решение я предложил, вам осталось побольше по этой теме прочитать и применить у себя.
В принципе вполне реально, примерно так же сделаны игры в текстовом режиме: сообщения с клавиатуры считываются без вывода на дисплей, а потом сама программа определяет где ей что рисовать. Где область ввода, а где лог чатика. Теоретически, для этого применяются ESC-последовательности и переключение терминала для прямой работы (raw input), но они свои для каждой разновидности. Для унификации и придумали библиотеку curses.
0
|
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
|
||||||
12.05.2018, 05:40 [ТС] | 11 | |||||
Я нашел способ. Оказалось, существует функция _kbhit(), которая возвращает true, если нажата клавиша какая-либо. Вот кусок кода.
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
12.05.2018, 07:35 | 12 |
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 минуты Примитивная демка. Управление далеко не полное, с русским языком косяки, нет синхронизации со временем... Но концепцию поясняет. Кликните здесь для просмотра всего текста
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 |
Уж лучше сторонние общеизвестные библиотеки, чем ms-специфичные.
Я уже писал вроде. Разновидностей терминалов куча, у каждого свой способ доступа. Лучше воспользоваться наработками других людей, чем реализовывать все эти варианты ручками. Хотя ради получения опыта можно и так.
0
|
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
|
|
12.05.2018, 20:00 [ТС] | 17 |
COKPOWEHEU,
Понимаете, эта программа не какой-либо оплачиваемый проект. Я ее делаю с одной целью - самообучение. В моем чате нет ни одного стороннего элемента. Я создал чистый проект и начал "творить". Поэтому какой мне смысл брать "наработки других людей", раз на то пошло, я бы с радостью изучил алгоритмы работы "curses".
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
13.05.2018, 09:46 | 18 |
Потому что они уже наработаны. А еще протестированы и отлажены значительно лучше, чем ваш велосипед.
Ну и именно по 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 |
Теоретически можно, я этот вариант уже предлагал. Но у него куча недостатков: при выводе одним потоком текста, курсор ускачет к месту вывода. Но второй поток продолжает считать, что курсор не двигался. Какой текст при этом будет виден пользователю - вообще неизвестно. Кроме того, проблемы с синхронизацией потоков, решаемые, но все же.
0
|
13.05.2018, 15:05 | |
13.05.2018, 15:05 | |
Помогаю со студенческими работами здесь
20
Ограничение на ввод символов (разрешить ввод только цифр) Потоковый ввод и ввод данных. Работа с числами Ввод в CEdit только символов 'A'B'C'D'E'F' и цифр от 0 до 9 (ввод в HEX) Что работает быстрее, ввод с консоли или ввод с файла? Ввод с клавиатуры - требовать у пользователя ввод, пока он не будет корректным Ввод целого положительного числа. Если вводится отрицательное число - повторить ввод Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |