chaplin.u@gmail.com Опубликовано 21 января, 2017 Поделиться Опубликовано 21 января, 2017 вроде всё путём : 1.BluetoothLE1->DiscoverDevices(ScanningTime); - находит устройство 2.FBLEDevice->Connect(); - подключается 3. FBLEDevice->DiscoverServices(); - читает сервисы но периодически застревает Кто-то знает что может быть ? Цитата Ссылка на комментарий
0 chaplin.u@gmail.com Опубликовано 21 января, 2017 Автор Поделиться Опубликовано 21 января, 2017 что-то тут не ладно с логикой : function TAndroidBluetoothLEDevice.DoDiscoverServices: Boolean; const BLEDiscoverServicesTimeout = 15000; begin InternalGetGattClient; Result := False; if GetIsConnected then begin FServicesEvent.ResetEvent; FServices.Clear; FLastStatus := TBluetoothGattStatus.Failure; if FRefreshMethod and FForceRefreshCachedServices then FJGatt.refresh; Result := FJGatt.discoverServices; if Result then begin FServicesEvent.WaitFor(BLEDiscoverServicesTimeout); Result := FLastStatus = TBluetoothGattStatus.Success; if Result then begin InternalGetServices; FReconnected := False; DoOnServicesDiscovered(Self, FServices); end; end; end; end; --------------- не могу понять зачем задержка на 15000 ? Цитата Ссылка на комментарий
0 kami Опубликовано 21 января, 2017 Поделиться Опубликовано 21 января, 2017 27 минут назад, chaplin.u@gmail.com сказал: не могу понять зачем задержка на 15000 ? ну, это же не гарантированная задержка. Если какой-либо другой поток сделает этому FServicesEvent.SetEvent, то будет выход из WaitFor. Цитата Ссылка на комментарий
0 chaplin.u@gmail.com Опубликовано 21 января, 2017 Автор Поделиться Опубликовано 21 января, 2017 а если нет - то будет стоять 15 секунд ???? это что за логика ? я поменял на 500 ( полсекунды ) и стало гораздо лучше. а это что за перл ? Result := FLastStatus = TBluetoothGattStatus.Success; Цитата Ссылка на комментарий
0 kami Опубликовано 21 января, 2017 Поделиться Опубликовано 21 января, 2017 21 минуту назад, chaplin.u@gmail.com сказал: а если нет - то будет стоять 15 секунд ???? это что за логика ? да, будет. Вопрос про логику - на quality.embarcadero.com. 21 минуту назад, chaplin.u@gmail.com сказал: а это что за перл ? без понятия. Но с учетом того, что перед этим идет FLastStatus := TBluetoothGattStatus.Failure; то другой поток все-таки по мнению авторов кода существует. И в нем статус может (и по идее - должен) поменяться. На основании каких условий - нужно разбираться с классами этого синезуба. Цитата Ссылка на комментарий
0 chaplin.u@gmail.com Опубликовано 21 января, 2017 Автор Поделиться Опубликовано 21 января, 2017 1 минуту назад, kami сказал: Вопрос про логику - на quality.embarcadero.com. дык и я в тот огород камень Цитата Ссылка на комментарий
0 chaplin.u@gmail.com Опубликовано 21 января, 2017 Автор Поделиться Опубликовано 21 января, 2017 27 минут назад, chaplin.u@gmail.com сказал: Result := FLastStatus = TBluetoothGattStatus.Success; так можно на дельфях писать ? правописание правильное ? Цитата Ссылка на комментарий
0 kami Опубликовано 21 января, 2017 Поделиться Опубликовано 21 января, 2017 7 минут назад, chaplin.u@gmail.com сказал: так можно на дельфях писать ? правописание правильное ? Да. Сравнение одного значения с другим, получается True или False и записывается в Result. Что ж здесь неправильного? Цитата Ссылка на комментарий
0 chaplin.u@gmail.com Опубликовано 21 января, 2017 Автор Поделиться Опубликовано 21 января, 2017 Я так понимаю вот уже получен Result := FJGatt.discoverServices; и если " if Result then begin FServicesEvent.WaitFor(BLEDiscoverServicesTimeout); Result := FLastStatus = TBluetoothGattStatus.Success; зачем опять брать Result и сравнивать с FLastStatus := TBluetoothGattStatus.Failure; чёто наворотили они. Цитата Ссылка на комментарий
0 kami Опубликовано 21 января, 2017 Поделиться Опубликовано 21 января, 2017 56 минут назад, chaplin.u@gmail.com сказал: чёто наворотили они. ну почему? стандартная практика выполнения следующего действия, если выполнено предыдущее. Вернее, один из стандартных приемов, если разработчик отрицательно относится к слову exit. читать следует так: если получилось FJGatt.discoverServices, то пробуем чего-то дождаться. Если дождались успешно - то делаем все остальное. Т.е. до "всего остального" очередь дойдет только если выполнились успешно оба предыдущих условия. При этом второе условие выполнилось только в случае успешного выполнения первого. Цитата Ссылка на комментарий
0 chaplin.u@gmail.com Опубликовано 22 января, 2017 Автор Поделиться Опубликовано 22 января, 2017 ага и сидим 15 секунд и ждём может чего произойдёт. И я знаю что - юзер вырубит апликацию и пошлёт матом того кто это написал. Цитата Ссылка на комментарий
0 kami Опубликовано 22 января, 2017 Поделиться Опубликовано 22 января, 2017 2 часа назад, chaplin.u@gmail.com сказал: ага и сидим 15 секунд и ждём может чего произойдёт. ну, это уже ваша задача - выяснить, почему не происходит SetEvent, в результате чего ожидание висит все 15 секунд. И где оно вообще должно происходить. И должно ли. Цитата Ссылка на комментарий
Вопрос
chaplin.u@gmail.com
вроде всё путём :
1.BluetoothLE1->DiscoverDevices(ScanningTime); - находит устройство
2.FBLEDevice->Connect(); - подключается
3. FBLEDevice->DiscoverServices(); - читает сервисы но периодически застревает
Кто-то знает что может быть ?
Ссылка на комментарий
11 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.