2013-09-17 3 views
3

Как я могу выполнить некоторые команды во время ожидания ввода?Как выполнять команды WHILE, принимая ввод?


Что-то вроде этого:

while(/*taking input*/) { 
    sleep(15); 
    cout<<"You still there?"; 

    //...  
} 



Так он просит для ввода, но в то время как он ждет ENTER, чтобы быть нажата она выполняет команды.
Возможно ли это?


Редактировать:
Спасибо за все предложения :)

+0

Вы можете делегировать работу в другом потоке. –

+1

многопоточность. Хотя, если вы печатаете что-то на консоль WHILE, который пользователь печатает, все может стать беспорядочным/запутанным для пользователя. – SigTerm

+0

Как я уже сказал, я все еще новичок. Спасибо в любом случае, я это выясню :) –

ответ

3

Используя средства потоковой передачи C++ 11, вы можете просто создать «рабочий» поток, который выполняет эту работу, пока вы ждете ввода.

std::async - простой способ асинхронно получить результат операции; ваше описание проблемы не очень точное, поэтому я не знаю, что еще я могу добавить здесь.

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

После комментария Мартина, я действительно вижу проблему с большей ясностью; в этом случае лучше всего искать более абстрактные API-интерфейсы ввода-вывода, которые обеспечат неблокирующий ввод или создадут ваш собственный интерфейс на основе ОС.

+0

Нет, нити не помогают для такого рода работ. I/O блокирует и сериализуется. Инициирующие потоки не помогут выводить материал во время ожидания ввода. C++ просто не предусматривает этого вообще. –

1

Вы хотите, чтобы породить другой поток для запуска параллельно с потоком, что ждет ввода/вывода (вход со стандартного входа в данном случае). Запустите все, что вы хотите сделать, ожидая ввода/вывода в этом порожденном потоке. Посмотрите на Boost threads

2

Есть 2 способа для достижения своей цели:

  1. Многопоточности
  2. Асинхронных IO

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

0

Если вы позволите, чтобы добавить что-то за пределами сегмента, он будет работать:

[[email protected]]:~$ cat main.cpp 
#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string s; 
    while(getline(cin, s) and s != "") { 
    cout << "You still there?" << endl; 
    } 
} 
[[email protected]]:~$ r 
adb 
You still there? 
sfcetgw 
You still there? 
wefew 
You still there? 

[[email protected]]:~$ 
Смежные вопросы