Установка таймаута на ifstream в C ++? - PullRequest
2 голосов
/ 22 февраля 2009

Мы пытаемся прочитать данные от двух USB-мышей, подключенных к linux box (эти данные используются для одометрии / локализации на роботе). Таким образом, мы должны непрерывно читать с каждой мыши, насколько она двигалась. Проблема в том, что когда мышь не движется, она не отправляет никаких данных, поэтому поток файлов, из которого мы получаем выполнение блоков данных, и, следовательно, программа не может выполнять вычисления одометрии (которые включают измерение времени для скорости) .

Есть ли способ установить время ожидания для входного потока (мы используем ifstream в C ++ и читаем из / dev / input / mouse), чтобы мы могли знать, когда мышь не двигается, вместо ожидания получения события? Или нам нужно связываться с потоками (аааа ...)? Любые другие предложения приветствуются!

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 22 февраля 2009

Распространенным способом чтения из нескольких файловых дескрипторов в linux является использование select (). Я предлагаю начать с manpage . Основной системный поток выглядит следующим образом:

1) Инициализация устройств
2) Получить список файловых дескрипторов устройства
3) Установите время ожидания
4) Вызовите select с файловыми дескрипторами и timeout в качестве параметров - он будет блокироваться до тех пор, пока в одном из файловых дескрипторов не появятся данные или не истечет время ожидания
5) Определите, почему select вернулся и действуйте соответствующим образом (то есть вызовите read () для дескриптора файла, в котором есть данные). Возможно, вам придется внутренне буферизовать результат чтения, пока не будет получен целый грамм данных.
6) вернуться к 4.

Это может стать основным циклом ваших программ. Если у вас уже есть другой основной цикл, вы можете запустить вышеописанное без цикла, но вам нужно будет убедиться, что функция вызывается достаточно часто, чтобы вы не потеряли данные на последовательных портах. Вам также следует убедиться, что ваша частота обновления (т. Е. 1 / время ожидания) достаточно быстра для вашей основной задачи.

Select может работать с любым файловым дескриптором, таким как сетевые сокеты, и всем остальным, что предоставляет интерфейс через файловый дескриптор.

1 голос
/ 22 февраля 2009

То, что вы ищете, - это асинхронный способ чтения из ifstream, такой как сокетная связь. Единственное, что могло бы помочь, это функция readsome , возможно, она возвращается, если данные недоступны, но я сомневаюсь, что это поможет.

Лучше всего использовать потоки.

0 голосов
/ 22 февраля 2009

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

0 голосов
/ 22 февраля 2009

Нет, такого метода нет. Вам придется дождаться события или создать собственный класс Timer и дождаться перезапуска тайм-аута или использовать потоки.

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