Поток(stream) ввода - то же файловой дескриптор только его номер заранее известен. Используйте асинхронное чтение (асинхронный ввод - вывод), например системные вызовы select, poll, aio_read, boost::asio, итд итп. Как заметил Арянское радио - альтернативный подход с блокирующими вызовами и потоками(thread) - более распространён, и легче воспринимаем большинством программистов, чем горождение машины состояний для обработки конкурентных задач в одном потоке. Но если фреймворк, такой как Qt же сделал это за вас(создал loop для обработки событий, ...), то работа в событийной - ориентированной модели будет ещё проще нежели с потоками. Например асинхронное чтение завязанное на таймер.