これはDelphi 10.1 Berlin(おそらくパッチが適用されていません)です。 このコードはかなり基本的です。 このコードは、安定していません。Delphi BluetoothLE WriteCharacteristic Access Violation
なぜですか?
procedure TBLEEnumerator.WriteToSubScribedCharacteristic(bs: TArray<byte>);
var
//member ble is an instance of TBluetoothLE
chr: TBluetoothGattCharacteristic;
begin
chr := ble.GetCharacteristic(FBLEGattService, ChooseCharacteristic);
chr.SetValue(bs);
ble.WriteCharacteristic(self.dev, chr);
end;
他のいくつかの注意事項:Windows上で実行している場合 このエラーはあるが、私はこのコードは、モバイルデバイス上でも実行する予定。
この関数は、メインスレッドから呼び出され、TBluetoothLEコンポーネントのラッパーです。元の接続/スキャンは、メインスレッドからも処理されます。
明らかに簡単です。 TArrayは参照カウントの動的配列です。ときにタンク
はここでコールスタックです:
:761d31ce ucrtbase.memcpy + 0x4e
System.Win.BluetoothWinRT.BytesToIBuffer(???,???)
System.Win.BluetoothWinRT.TWinRTBluetoothGattCharacteristic.SetValueToDevice
System.Win.BluetoothWinRT.TWinRTBluetoothLEDevice.DoWriteCharacteristic$52$ActRec.$0$Body
System.Classes.TAnonymousThread.Execute
System.Classes.ThreadProc($7511F40)
System.ThreadWrapper($5A30D30)
:740162c4 KERNEL32.BaseThreadInitThunk + 0x24
:77060fd9 ;
:77060fa4 ;
'chr'をローカルとして宣言しましたが、その値を設定しましたが、' self.chr'を 'WriteCharacteristic'に渡しました。あなたのローカル 'chr'は同じ名前のフィールドを隠しているようですが、あなたはそれらの使用を混乱させるようです...それは目的ですか?たぶん 'self.chr'は' nil'です...宣言しても何も使わなかったら?私はこれに[mcve]が必要だと思います。少しのデバッグもうまくいかないでしょう... 'ble.WriteCharacteristic'が呼び出されたときに' self.chr'が割り当てられていますか? –
呼び出しスタックによれば、コードは匿名のスレッドで実行されるため、コードがスレッドセーフではない可能性があります。 – whosrdaddy
self.chrは良い観察でした。しかし、それは修正ではありませんでした。私はchrをメンバーとして使うときにこの不安定さを見てからローカルに移動しました...しかし明らかに私は1つの部分を変更するのを忘れました。アプリケーションはまだクラッシュします。 – jason