169 похожих чатов

Использую пакет для BLE. Пакет работает асинхронно. Отправляю данные - ответ

приходит в callback.

Возникла необходимость организовать синхронную прием-передачу. Отправляем данные, ждем приема, или выходим по таймауту
Сначала сделал с помощью Future (с await и timeout) и Completer. Примерно так:
Completer<Uint8List> _syncFutureCompleter = Completer();
Future<Uint8List> write(List<int> data) async {
_syncFutureCompleter = Completer();

/*... */

return _syncFutureCompleter.future;
}

void _handleValueChange(
String deviceId, String characteristicId, Uint8List value) {

if (!_syncFutureCompleter.isCompleted) {
_syncFutureCompleter.complete(Uint8List.fromList(value));
}
}

И всё бы хорошо, но встречается проблема, что ответ приходит не целиком за раз, а по частям. То есть в несколько вызовов callback. В результате Completer завершается по первой части данных.
Переделал на отдельный таймер:
List<int> answer = List.empty(growable: true);
late Timer timer;

void _handleValueChange(
String deviceId, String characteristicId, Uint8List value) {
answer.addAll(value);
}
Future<Uint8List> write(List<int> data, Duration timeout) async {

answer.clear();

_syncFutureCompleter = Completer();
timer = Timer(
timeout,
() {
if (!_syncFutureCompleter.isCompleted) {
_syncFutureCompleter.complete(Uint8List.fromList(answer));
}
},
);

/*... */

return _syncFutureCompleter.future;
}
Проблема ушла, но в таком случае всегда приходится ждать весь заданный Duration.
Может есть еще какие нибудь более удобные способы реализовать синхронность? (Кроме как заранее знать длину ответа)

1 ответов

15 просмотров

Там известна вся длинна байт аррей:? Тип если лист не заполнен то ждать заполнения и после переход к другой функции

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта