Чтение асинхронно из stdin с Qt

Я хотел бы асинхронно читать stdin с Qt. Я не хочу использовать отдельный поток или настраивать таймер, чтобы периодически проверять, имеет ли файл дескриптор данные. Как я могу это сделать?

5 ответов

Если вы читаете документацию Qt, в ней говорится, что вы не можете этого сделать, потому что она не переносима. Почему бы не использовать сокет TCP, который должен работать, если у вас есть контроль над другим концом. В худшем случае вы можете сделать прокси-приложение.


Если вы хотите интегрировать ввод/вывод stdin/stdout/stderr с циклом событий QT, вы можете:

  • Используйте QSocketNotifier и выполняйте ввод/вывод самостоятельно с помощью read(2) и write(2), или
  • Получить объект QFile и вызвать bool QFile::open ( int fd, OpenMode mode ) выполнить ввод/вывод Qt-стиля с ним.


Если вы открыты для использования boost, вы можете использовать библиотеку Asio. A posix::stream_descriptor, присвоенный STDIN_FILENO, работает достаточно хорошо. См. Также этот ответ.


Попробуйте использовать QSocketNotifier

QSocketNotifier * notifier = new QSocketNotifier( FDSTDIN, QSocketNotifier::Read );
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));


Как сказал Крис, лучшим способом было бы иметь отдельный поток, который будет опроса от stdin и заполнять данные для потока отображения или обработки для обработки.

Теперь вы можете настроить QTimer и настроить обработчик для сигнала timeout() для чтения из stdin. Метод реализации полностью зависит от вас.

И для второго метода вы можете взглянуть на документацию по таймеру QT для примера о том, как это сделать. Одна вещь, которую нужно запомнить, - это перезапустить таймер после завершения обработки.

licensed under cc by-sa 3.0 with attribution.