2014-11-23 4 views
0

Я сделал консольные приложения, который принимает команду из двух источников:Прерывание GetLine() во время цикла в C++

  1. Фактическая консоль -> это в то время (GetLine()) цикл в отдельном потоке.
  2. сервер WebSocket -> это также работает на отдельном потоке

Если команда введена, команда сохраняется в векторе, пока другой цикл в то время (который ходит каждые 20 мс) не петли корыто все команды введенное за прошедшее время. Если он читает команду, он выполняет ее.

Теперь существует команда Stop, которая останавливает приложение. При вводе приложение закрывается, как ожидалось. Но проблема в том, что это занимает некоторое время, и вы все равно можете вводить текст из первого источника команд (getline()). Как только вы напечатаете что-то, последовательность выключения останавливается и ждет, пока вы не нажмете enter.

Я завершаю первый поток (содержащий цикл getline) после запуска последовательности останова. Но это не работает ...

Любые идеи?

Заранее благодарен!

+0

Я не могу этого сделать, потому что эта нить не знает, и когда он получит это сообщение, уже слишком поздно ... – Antony

+0

Я не могу загрузить код из 50 классов и заголовков. Я попытался объяснить структуру как можно лучше. Мой код не нужен, мне просто нужен способ отменить действие getline(), которое зацикливается через некоторое время. Если вы действительно думаете, что код нужен, я постараюсь опубликовать соответствующие фрагменты. – Antony

ответ

0

getline() является блокирующим вызовом, вам, вероятно, придется использовать что-то другое, если вы хотите получать сообщения (т. Е. Команду отключения) из других потоков. Вы не указали, какую библиотеку вы используете для многопоточности, и как вы завершаете поток чтения консоли (возможно, что ваш способ остановить поток по-прежнему не заставляет его выйти из getline)

Этот вопрос, похоже, имеет некоторые важные Ответы: Peek stdin using pthreads

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

Кроме того, факт, что у вас есть какой-то цикл, который «опроса» вектора каждые 20 мс указывает на то, что у вас могут быть некоторые недостатки в общем дизайне вашего приложения. Попытайтесь избавиться от него, используя более подходящие средства для передачи событий между потоками, таких как переменные условий.

+0

Я использую стандартные библиотеки C++ для потоков. Чтобы добавить строку в вектор, я использую мьютекс, поэтому проблем нет. Для цикла, который запускается каждые 20 мс: я не вижу альтернативы, потому что будет больше потоков, которые будут отправлять команды. И что вы подразумеваете под «использованием чего-то другого». Я посмотрел на cin >> но он делает то же самое: он ждет, пока не будет введен вход. – Antony