2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Delphi मध्ये BLE विकासाय, एकं TBlueToothLe इत्येतत् अन्तरफलके कर्षयन्तु तथा च BLE विकासाय एतस्य नियन्त्रणस्य उपयोगं कुर्वन्तु, यथा Bluetooth कङ्कणं संयोजयितुं ।
Demo इत्यस्मिन् BLEScanner इति कार्यक्रमः अस्ति यः Delphi इत्यनेन सह आगच्छति, यस्य उपयोगः विकासस्य आरम्भबिन्दुरूपेण कर्तुं शक्यते ।
यदि उपर्युक्तः कार्यक्रमः विण्डोज-अन्तर्गतं निष्पादितः भवति तर्हि यन्त्रस्य स्कैनिङ्गानन्तरं यदि मूषकः कस्मिंश्चित् यन्त्रे क्लिक् करोति तर्हि अन्तरफलकं स्थगितम् भवितुम् अर्हति तथा च कार्यक्रमः प्रतिक्रियां न दास्यति । कार्यप्रबन्धनक्षेत्रं दृष्ट्वा सत्यं यत् कार्यक्रमः अप्रतिसादः अस्ति, दुर्घटना च अभवत् ।
चयनितयन्त्रस्य सेवाः स्कैन् कर्तुं मूषकं नुदन्तु । ततः यदा यन्त्रस्य सेवाः आविष्कृताः भवन्ति तदा TBluetoothLE इत्यस्य OnServicesDiscovered इवेण्ट् प्रवर्तते । अस्मिन् सन्दर्भे यन्त्रस्य बहुविधाः सेवाः एकस्मिन् लूप् मध्ये पठ्यन्ते, ततः कस्यापि सेवायाः कृते तस्य Character इति नाम लूप् मध्ये पठ्यते । क्रैश तत्रैव भवति यत्र लूप् Character इति पठति ।
किमर्थं दुर्घटना अभवत् इति अहं न जानामि। परन्तु मया समाधानं प्राप्तम्, कोडः निम्नलिखितरूपेण अस्ति।
- 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;
उपरिष्टाद् कोड् मध्ये TTask.Run मया योजितम् । TThread.Synchronize इति अपि मया योजितम् । TTask.Run तथा TThread.Synchronize इत्येतत् निष्कासयन्तु शेषः कोडः Delphi इत्यनेन सह आगच्छति Demo इत्यस्य मूलकोड् अस्ति ।
प्रथमं मूलसङ्केतं TTask.Run इत्यत्र स्थापयन्तु, यस्य अर्थः अस्ति यत् एतान् कोड् निष्पादनार्थं थ्रेड् मध्ये स्थापयन्तु । मूलतः OnServicesDiscovered इवेण्ट् उत्थापितस्य थ्रेड् इत्यस्य कार्यान्वयनस्य स्थाने । सम्भाव्यकारणम्: OnServicesDiscovered इत्यस्य प्रेरणायुक्तः थ्रेड् बहुकालं यावत् कार्यं कर्तुं न शक्नोति ।
कोडः थ्रेड् मध्ये निष्पादितः भवति यदा भवन्तः इन्टरफेस् नियन्त्रणे दत्तांशं लिखितुम् अर्हन्ति, यथा Listbox2.Items.Add कोड्, तदा भवन्तः थ्रेड् समन्वयनं कर्तुं प्रवृत्ताः भवन्ति । अतः TThread.Synchronize इति योजयन्तु ।
मम विकासपर्यावरणम्
भिन्न-भिन्न-वातावरणेषु घटनाः भिन्नाः भवितुम् अर्हन्ति । अतः अत्र मम विकासपर्यावरणम् अस्ति : १.
डेल्फी ११ सामुदायिक संस्करणम्;
विण्डोज ११ गृहसंस्करणम्;
संकलितं चालनीयं च लक्ष्यप्रोग्रामं Win32 संस्करणम् अस्ति ।
अस्मिन् Demo इत्यस्मिन् Android इत्यस्य अन्तर्गतं उपर्युक्ताः समस्याः भविष्यन्ति वा इति परीक्षणं नास्ति । परन्तु मम विश्वासः अस्ति यत् एण्ड्रॉयड् इत्यस्य अन्तर्गतं TTask.Run इत्येतत् योजयितुं श्रेयस्करं भविष्यति।
अत्र उल्लिखितः Demo, Delphi संस्थापनानन्तरं यदि पूर्वनिर्धारितरूपेण संस्थापितः अस्ति तर्हि Demo कार्यक्रमः अस्ति :
C:UsersPublicDocumentsEmbarcaderoStudio22.0SamplesObject Pascalबहु-उपकरणनमूनायन्त्रसंवेदकाः सेवाश्चBluetoothBLEScanner
BLE कार्यक्रमानां विकासाय Delphi इत्यस्य उपयोगे कोऽपि समस्या नास्ति, यथा bracelet APP इत्यस्य निर्माणम् । परन्तु ज्ञातव्यं यत् TBluetoothLE नियन्त्रणस्य अनेकघटनासु अत्यधिकं कोडं न निष्पादयितुं सर्वोत्तमम् । यदि जटिलव्यापारतर्कः अस्ति तर्हि तत् पृथक् थ्रेड् मध्ये निष्पादयितुं सर्वोत्तमम् ।
Delphi कृते नवनिर्मितं TTask.Run अस्मान् थ्रेड् निष्पादने बहु कोडं क्षिप्तुं शक्नोति कोडलेखनविधिः पूर्वापेक्षया बहु सरलः यदा अस्माभिः थ्रेड् क्लास् निर्मातव्यम् आसीत् ।