Страница 1 из 1

Первать FileRead

СообщениеДобавлено: 21.10.2015 12:32:59
still
Читаю FileRead в потоке с устрофства /dev/ttyUSB0. (USB модем)
Пока данные есть, все хорошо. Когда данных нет, исполнение потока останавливается на FileRead и далее не выполняется, до появления данных.
Подойдет любой способ прерывания ожидания:
1. Callback - как?
2. Таймаут - как?
3. Проверить перед чтением наличие данных. Через FileSeek(h,0,2) возвращает -1.

Не подойдет:
1. Убийство потока. Крайне не желательно.

Платформа Linux.

Добавлено спустя 2 часа 43 минуты 57 секунд:
Ладно.
Пока решил вопрос тем что сам же в порт и пишу, провоцируя очередное чтение, и выхожу по флагу Terminate.
Однако, вопрос остается. Если кто боролся с таким - поделитесь.

Re: Первать FileRead

СообщениеДобавлено: 22.10.2015 09:54:53
Alexx2000
Использовать select, poll (в FPC функции fpSelect, fpPoll). В интернете полно примеров для C, без проблем переносится на FPC.

Re: Первать FileRead

СообщениеДобавлено: 22.10.2015 10:28:48
Mikhail
still писал(а):Читаю FileRead в потоке с устрофства /dev/ttyUSB0. (USB модем)
Пока данные есть, все хорошо. Когда данных нет, исполнение потока останавливается на FileRead и далее не выполняется, до появления данных.
Подойдет любой способ прерывания ожидания:
1. Callback - как?
2. Таймаут - как?
3. Проверить перед чтением наличие данных. Через FileSeek(h,0,2) возвращает -1.

Не подойдет:
1. Убийство потока. Крайне не желательно.

Платформа Linux.

Добавлено спустя 2 часа 43 минуты 57 секунд:
Ладно.
Пока решил вопрос тем что сам же в порт и пишу, провоцируя очередное чтение, и выхожу по флагу Terminate.
Однако, вопрос остается. Если кто боролся с таким - поделитесь.

Если просто нужно завершить, то надо закрыть файл и функция FileRead завершится с ошибкой, во всяком случае в Windows это так делается.

Re: Первать FileRead

СообщениеДобавлено: 22.10.2015 16:10:21
still
Если просто нужно завершить, то надо закрыть файл и функция FileRead завершится с ошибкой, во всяком случае в Windows это так делается


Сожалею, но это не так. Чтение остается висеть, даже при закрытии файла. Проверил в разных позах.

Добавлено спустя 18 минут 32 секунды:
Код: Выделить всё
Использовать select, poll (в FPC функции fpSelect, fpPoll). В интернете полно примеров для C, без проблем переносится на FPC.


Прошу чуть подробнее, если вы с этим работали.
Правильно ли я понял:
Перед чтением я вызываю fpPoll передав в него некую структуру pollfd содержающу handle файла полученного при FileCreate? После таймаута чтение завершится с ошибкой в случае отсустввия данных. Так?