怎么查看一个网站页面的seo优化情况,制作公司网站一般多久能好,wordpress代替系统,帝国cms 孕婴网站模板概念
Delphi 的 BLE 开发#xff0c;拖一个 TBlueToothLe 到界面上#xff0c;使用这个控件#xff0c;就可以进行 BLE 的开发#xff0c;比如去连接一个蓝牙手环。
Delphi 自带的 Demo 里面#xff0c;有一个 BLEScanner 程序#xff0c;可以作为开发的起点。
问题
…概念
Delphi 的 BLE 开发拖一个 TBlueToothLe 到界面上使用这个控件就可以进行 BLE 的开发比如去连接一个蓝牙手环。
Delphi 自带的 Demo 里面有一个 BLEScanner 程序可以作为开发的起点。
问题
上述程序如果在 Windows 底下执行扫描出设备后如果鼠标点击某个设备可能会界面冻结程序没有响应。看任务管理区确实程序没有了响应死机了。
原因分析
鼠标点击是执行对选中设备的服务的扫描。然后当发现该设备的服务后触发了 TBluetoothLE 的 OnServicesDiscovered 事件。在该事件中循环读取该设备的多个服务然后对某一个服务循环读取它的 Character 的名字。死机正是循环读取 Character 那里。
为什么会死机我不知道。但发现一个解决办法代码如下
procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
varServiceIndex: Integer;Service: TBluetoothGattService;CharacteristicIndex: Integer;Characteristic: TBluetoothGattCharacteristic;
begin//以下代码如果不包到 TTask.Run 里面原本的代码没有在 WINDOWS 底下执行到 for //CharacteristicIndex : 0 to Service.Characteristics.Count 会界面冻结而且单步跟踪也停止 //了没有往下执行。TTask.Run( procedurevarServiceIndex: Integer;CharacteristicIndex: Integer;beginif AServiceList.Count 0 thenbeginfor ServiceIndex : 0 to AServiceList.Count - 1 dobeginService : AServiceList[ServiceIndex];TThread.Synchronize(nil,procedurebeginListbox2.Items.Add((ServiceIndex 1).ToString - Service.UUIDName - Service.UUID.ToString);end);//以下代码会导致死机如果断点跟踪直接就是停在 for 这一行不会继续往下执行。for CharacteristicIndex : 0 to Service.Characteristics.Count - 1 dobeginCharacteristic : Service.Characteristics[CharacteristicIndex];TThread.Synchronize(nil,procedurebeginListbox2.Items.Add( - Characteristic.UUIDName - Characteristic.UUID.ToString);end);end;end;endelseTThread.Synchronize(nil,procedurebeginListbox2.Items.Add(- Access not allowed or no service available);end);end);//Listbox1.Enabled : True;
end;
代码解释
上述代码里面TTask.Run 是我增加的。TThread.Synchronize 也是我增加的。去掉 TTask.Run 和 TThread.Synchronize 剩下的代码就是 Delphi 自带的 Demo 原本的代码。
首先把原本的代码放进 TTask.Run 里面就是把这些代码放进了一个线程去执行。而不是让原本引发 OnServicesDiscovered 这个事件的线程去执行。可能原因引发 OnServicesDiscovered 的这个线程不能执行太多耗时的任务。
代码在线程里面执行当需要往界面控件写数据时比如 Listbox2.Items.Add 这样的代码就需要做一个线程同步。因此加上 TThread.Synchronize。
我的开发环境
不同的环境下可能现象不同。因此这里要提一下我的开发环境
Delphi 11 社区版
Windows 11 家庭版
编译运行的目标程序是 Win32 版本。
没有测试这个 Demo 在安卓底下是否会有上述问题。但我相信在安卓下同样加上 TTask.Run 也会更好。
Demo 程序的位置
这里提到的 Demo安装了 Delphi 以后如果是默认安装这个 Demo 程序在
C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\BLEScanner
结论
使用 Delphi 开发 BLE 程序比如做一个手环 APP是没有问题的。但是需要留意在 TBluetoothLE 这个控件的很多事件里面最好不要执行太多的代码。如果有复杂的业务逻辑最好放到单独的线程里面去执行事件方法里面仅仅是启动对应的线程。
对于 Delphi 来说新增加的 TTask.Run 让我们把一大堆代码丢进线程执行代码写法相对以前必须搞一个线程类简单了很多。