Technology sharing

Difficultas in usu Delphi ad Bluetooth BLE evolutionis

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

conceptum

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.

quaestio

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.

Causa Analysis

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;

  1. procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
  2. var
  3. ServiceIndex: Integer;
  4. Service: TBluetoothGattService;
  5. CharacteristicIndex: Integer;
  6. Characteristic: TBluetoothGattCharacteristic;
  7. begin
  8. //以下代码如果不包到 TTask.Run 里面(原本的代码没有),在 WINDOWS 底下,执行到 for
  9. //CharacteristicIndex := 0 to Service.Characteristics.Count 会界面冻结,而且单步跟踪也停止
  10. //了,没有往下执行。
  11. TTask.Run(
  12. procedure
  13. var
  14. ServiceIndex: Integer;
  15. CharacteristicIndex: Integer;
  16. begin
  17. if AServiceList.Count > 0 then
  18. begin
  19. for ServiceIndex := 0 to AServiceList.Count - 1 do
  20. begin
  21. Service := AServiceList[ServiceIndex];
  22. TThread.Synchronize(nil,
  23. procedure
  24. begin
  25. Listbox2.Items.Add((ServiceIndex + 1).ToString + ' - ' + Service.UUIDName + ' - ' + Service.UUID.ToString);
  26. end
  27. );
  28. //以下代码会导致死机,如果断点跟踪,直接就是停在 for 这一行,不会继续往下执行。
  29. for CharacteristicIndex := 0 to Service.Characteristics.Count - 1 do
  30. begin
  31. Characteristic := Service.Characteristics[CharacteristicIndex];
  32. TThread.Synchronize(nil,
  33. procedure
  34. begin
  35. Listbox2.Items.Add(' - ' + Characteristic.UUIDName + ' - ' + Characteristic.UUID.ToString);
  36. end
  37. );
  38. end;
  39. end;
  40. end
  41. else
  42. TThread.Synchronize(nil,
  43. procedure
  44. begin
  45. Listbox2.Items.Add('- Access not allowed or no service available');
  46. end
  47. );
  48. end
  49. );
  50. //Listbox1.Enabled := True;
  51. end;

Code explicatio

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 programmatis locus

Demo hic memoratur, si Delphis insertis, si defalta inauguratur, programmatis Demo est:

C:UsersPublicDocumentsEmbarcaderoStudio22.0SamplesObject PascalMulti-Device SamplesDevice Sensores et ServicesBluetoothBLEScanner

finitione

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.