Приложение чата, как не испортить вывод - PullRequest
1 голос
/ 22 января 2010

У меня типичное приложение чата.

Клиентская часть реализована с использованием двух потоков.

Резьба1

do {

 show menu
 read option
 case option
  1: option1
  2: option2
  .
  .
  . 
  5:end
     end case
while (!end)

Тема 2:

do {

 read message from socket
 display message
while (!end)

Одной из проблем является быстрое выполнение Thread1, поэтому после обработки этого параметра снова отображается меню, прежде чем Thread2 сможет отобразить свое сообщение. Я решил эту проблему, поместив Thread1 в спящий режим на 1000 мс, но не знаю, есть ли лучший способ сделать это.

Другое: когда клиент ничего не делает, на экране появляется просто сообщение с просьбой о выборе варианта для обработки. Если другой Клиент отправляет ему сообщение, то это сообщение отображается после запроса, поэтому информация является грязной: вот пример того, что Клиент увидит после получения сообщения от другого клиента.

1.- Print users conected  
2.- Send message to all  
3.- Send message to a user  
4.- Quit  
Choose an option: Message received from user "david": hello!  

Есть ли способ справиться с этим?

Ответы [ 2 ]

1 голос
/ 22 января 2010

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

Тема 1
подождите, пока пользователь сделает выбор
пользователь делает выбор
процесс -> уведомляет поток 2 об обработке
подождите, пока поток 2 будет в порядке
подождите, пока пользователь сделает шоколад

Тема 2
ждать обработки из потока 1
отправляет данные через сокет
уведомляет поток 1, что все в порядке
ждать обработки из потока 1

Ваша вторая проблема может быть решена с помощью графического интерфейса. Существует не так много консольных программ для чата, и для этого есть причина. Unix-системы имеют ncurses для работы с позиционированием текста в консоли, но окна имеют только хаки, эквивалентные ncurses. Вы можете проверить это

0 голосов
/ 22 января 2010

Если ваши потоки взаимодействуют с каналом, первый поток может подождать, пока второй скажет: «Я закончил».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...