2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Pro progressione BLE in Delphi, TBlueToothLe in medium trahunt et hac potestate utuntur ad explicandum BLE, sicut armilla Bluetooth connectens.
BLEScanner programmatis est in Demo, quod cum Delphis venit, quod uti potest ut principium evolutionis accipiatur.
Si progressio supra sub Fenestra exsecuta est, inspecto artificio, si muris strepit in machinis, interface durare potest et programma non respondere. Negotium administrationis inspicientes, verum est propositum non invitamentum et ingruentem esse.
Click mus ad lustrandum officia delectae fabrica. Deinde, cum inventae sunt operae machinae, eventus TBluetoothLE's OnServices detectus Urguet. In hoc eventu multa opera fabrica in ansa leguntur, ac deinde pro quodam servitio, nomen eius charactere in ansa legitur. Fragor est, ubi fascias legit charactere.
Quid crepuerit, nescio. Sed solutionem inveni, in codice talis est;
- procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
- var
- ServiceIndex: Integer;
- Service: TBluetoothGattService;
- CharacteristicIndex: Integer;
- Characteristic: TBluetoothGattCharacteristic;
- begin
- //以下代码如果不包到 TTask.Run 里面(原本的代码没有),在 WINDOWS 底下,执行到 for
- //CharacteristicIndex := 0 to Service.Characteristics.Count 会界面冻结,而且单步跟踪也停止
- //了,没有往下执行。
- TTask.Run(
- procedure
- var
- ServiceIndex: Integer;
- CharacteristicIndex: Integer;
- begin
- if AServiceList.Count > 0 then
- begin
- for ServiceIndex := 0 to AServiceList.Count - 1 do
- begin
- Service := AServiceList[ServiceIndex];
-
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add((ServiceIndex + 1).ToString + ' - ' + Service.UUIDName + ' - ' + Service.UUID.ToString);
- end
- );
-
-
- //以下代码会导致死机,如果断点跟踪,直接就是停在 for 这一行,不会继续往下执行。
- for CharacteristicIndex := 0 to Service.Characteristics.Count - 1 do
- begin
- Characteristic := Service.Characteristics[CharacteristicIndex];
-
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add(' - ' + Characteristic.UUIDName + ' - ' + Characteristic.UUID.ToString);
- end
- );
-
- end;
-
- end;
- end
- else
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add('- Access not allowed or no service available');
- end
- );
-
- end
- );
-
- //Listbox1.Enabled := True;
- end;
In codice superiore, TTask.Run a me addita est. TThread.Synchronize a me etiam adiecta est. TTask.Run et TThread.Synchronize et reliquorum codicem amove est codex originalis Demonis qui cum Delphis venit.
Primum, codicem originalem pone in TTask.Run, quod significat hos codices in filo exsecutioni mandare. Loco ponendi sequelam quae principio excitavit eventus OnServicesDiscovered exsecutio. Ratio possibilis: Filum quod urguetur OnServicesDiscovered non potest nimis multa opera consumendi conficere.
Signum supplicium est in sequela. Cum notitias scribere ad interfaciendi potestatem debes, ut Listbox2.Items.Adde codicem synchronisationi filo facere debes. Ita adde TThread.Synchronize.
mea progressionem amet
In diversis ambitibus, phaenomena possunt esse diversa. Proin sit amet elit eget mi consequat tincidunt.
Delphi 11 vulgatam editionem;
Windows 11 Home Edition;
Programma scopum conficiendum et currendum est versio Win32.
Nulla probatio est num haec Demo superiores difficultates sub Android habebit. Sed credo sub Android, melius erit TTask.Run addere.
Demo hic memoratur, si Delphis insertis, si defalta inauguratur, programmatis Demo est:
C:UsersPublicDocumentsEmbarcaderoStudio22.0SamplesObject PascalMulti-Device SamplesDevice Sensores et ServicesBluetoothBLEScanner
Dubium non est in programmatis Delphis utendo evolvendis BLE, ut armillas faciens APP. Sed notandum est quod in multis eventibus de potestate TBluetoothLE, optimum est ne nimium codicem exequi. Si logica negotia implicata est, melius in filo separato exsequi.
Nam Delphi, nuper additae TTask.Run nobis permittit ut multum codicis in sequelam mittat.