خيط آمن ، نظام مراسلة غير متزامن وتبسيط للاتصال بين الفئات / الطبقات في دلفي التي تم إنشاؤها بواسطة فريق IPUB.
لدى Delphi نظام المراسلة الخاص به (System.messaging.pas) الذي يعمل بشكل جيد ولكنه متزامن تمامًا وغير آمن. في الأنظمة المتعددة المؤشرات ، نحتاج دائمًا إلى التواصل مع فصول أخرى ، وأحيانًا بشكل متزامن ، وأحيانًا غير متزامن ، وأحيانًا متزامنة مع الأساسي (في حالة واجهة المستخدم) ، والقيام بذلك بدون نظام رسائل (التواصل مباشرة) يجعل الرمز كبيرًا ومعقدًا للعديد من الأخطاء.
سيكون نظام المراسلة المثالي هو نظام آمن مؤشر ترابط يسمح للفصل بالاشتراك ثم إلغاء الاشتراك في الاستماع إلى رسالة معينة خلال هذا الوقت ، وهذه فئة المستمع التي ستستقبل الرسالة هي من الذي سيبلغ المرسل كيفية استدعاء الطريقة: على نفس الموضوع ( النشر ) ، في مؤشر الترابط الرئيسي ( الرئيسي ) ، في مؤشر ترابط آخر ( ASYNC ) وعلى موضوع آخر غير أساسي ( الخلفية ). هذا هو أساس نظام المراسلة الخاص بنا ، فإن الاستخدام يشبه نظامًا آخر حاليًا ، حافلة حدث Delphi (DEB).
انظر المقارنة في بيئة مع 1000 كائن:
| يشترك | بريد | إلغاء الاشتراك | |
|---|---|---|---|
| IPUB | 1.6368 مللي ثانية | 0.1215 مللي ثانية | 1.7666 مللي ثانية |
| ديب | 9.8832 مللي ثانية | 2.0293 مللي ثانية | 4.0022 مللي ثانية |
ILogOutMessage = interface
[ ' {CA101646-B801-433D-B31A-ADF7F31AC59E} ' ]
// here you can put any data
end ;أولاً ، يجب عليك الاشتراك في فصلك للاستماع إلى الرسائل ، ثم سيتم الاشتراك في جميع الأساليب العامة التي تحتوي على سمة [الاشتراك].
TForm1 = class (TForm)
procedure FormCreate (Sender: TObject);
procedure FormDestroy (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
[Subscribe(TipMessagingThread.Main)]
procedure OnLogout ( const AMessage: ILogOutMessage);
end ;
...
procedure TForm1.FormCreate (Sender: TObject);
begin
GMessaging.Subscribe(Self);
end ;
procedure TForm1.FormDestroy (Sender: TObject);
begin
GMessaging.Unsubscribe(Self);
end ;
procedure TForm1.OnLogout ( const AMessage: ILogOutMessage);
begin
Showmessage( ' Log out! ' );
end ;يمكنك أيضًا الإعلان عن الطريقة في الجزء المحمي ، ولكن للقيام بذلك ، تحتاج إلى إضافة أساليب صريحة {$ rtti ([Vcprotected ، vcpublic ، vcpublish])} قبل الفصل.
var
LMessage: ILogOutMessage
begin
LMessage := TLogOutMessage.Create;
GMessaging.Post(LMessage);في الأمثلة السابقة ، عرضنا رسالة واجهة ، ولكن هناك 3 نوع من الرسائل:
| هوية | المعلمة |
|---|---|
| الاسم (صريح) | خيط |
| GUID من واجهة المعلمة (ضمنية) | واجهة |
| GUID من واجهة المعلمة (ضمنية) + الاسم (صريح) | واجهة |
لتلقي الرسائل مع هوية الاسم ، فقط أعلن الاسم في السمة الطريقة:
[Subscribe( ' Name ' , TipMessagingThread.Main)]لإرسال رسائل بهوية الاسم ، فقط أبلغها في المكالمة النشر:
GMessaging.Post( ' Name ' , LMessage);ملاحظة: الاسم الصريح غير حساس للحالة.
في سمة [الاشتراك] ، يمكنك تحديد كيفية تنفيذ الطريقة التي تتلقى رسالة:
| عطوف | وصف |
|---|---|
| TipmessagingThread.Posting | الافتراضي ، سيتم استدعاء طريقة المشترك في نفس مؤشر ترابط النشر حيث تم استدعاء المنشور |
| tipmessagingthread.main | سيتم استدعاء طريقة المشترك في الموضوع الرئيسي |
| tipmessagingthread.async | سيتم استدعاء طريقة المشترك بشكل غير متزامن في خيط AnonnyMous جديد بخلاف مؤشر ترابط النشر |
| TipMessagingThread.background | إذا كان مؤشر ترابط النشر هو الخيط الرئيسي ، فسيتم استدعاء طريقة المشترك بشكل غير متزامن في مؤشر ترابط AnonnyMous جديد ، بخلاف مؤشر ترابط النشر. إذا لم يكن مؤشر ترابط النشر هو الخيط الرئيسي ، فسيتم استدعاء طريقة المشترك بشكل متزامن في نفس مؤشر ترابط النشر |
على الرغم من أن استخدام سمة [الاشتراك] للاشتراك أمر عملي للغاية ، إلا أنه محدود لأنه يجب عليك تحديد اسم الرسالة قبل التجميع ، وفي وقت التصميم ، وأحيانًا يكون من المفيد حقًا تحديد اسم الرسائل في وقت التشغيل. مثال ، رسالة لمنتج تم تغييره "Product_105346_Changed" ، اسم تلك الرسالة التي لا يمكنني تحديدها إلا في وقت التشغيل ، لذلك أضفنا خيار الاشتراك / إلغاء الاشتراك في طريقة للاستماع إلى رسالة يدويًا:
GMessaging.SubscribeMethod<string>( ' product_105346_changed ' , Self.OnProductChanged, TipMessagingThread.Posting);
GMessaging.UnsubscribeMethod<string>( ' product_105346_changed ' , Self.OnProductChanged);هاتان الطريقتان اليدويتان مستقلتان عن طرق الاشتراك / إلغاء الاشتراك. يمكنك دمج نفس الفئة مع الأساليب المشتركة تلقائيًا باستخدام سمة [الاشتراك] والاتصال بالاشتراك / إلغاء الاشتراك ، وفي نفس الوقت في هذه الفئة ذات الأساليب التي قمت بإضافتها يدويًا باستخدام المشترك / unbscribemethod.
فائدة أخرى من أساليب التسجيل يدويًا هي أنها لا تقيد الأساليب العامة فقط (على الرغم من أنه يمكن حل هذه المشكلة باستخدام توجيه الأساليب الصريحة RTTI).
تتمثل فكرة النظام في إعادة توجيه الرسائل أو الإشعارات أو التي تحتوي على أو عدم المعلومات ، لذلك ضع في اعتبارك أنه لا يُنصح بوضع رموز أو رموز كبيرة مع توقف (Waitfor) ضمن الأساليب المشتركة للاستماع إلى الرسائل ، لأن ذلك سيؤثر بشكل مباشر على أداء النظام ، حتى في أوضاع غير متزامنة.
هناك اعتبار آخر هو مجرد تذكير بالطريقة الصحيحة لاستخدام TTASK من Delphi. لا تستخدم أبدًا TTASK لتنفيذ الأساليب مع التوقفات (الأحداث ، الإشارات ، ...) ، لم يتم صنعها لذلك ، هدفها هو أداء مهام مستمرة وأبسط ، إذا كانت مهمتك أكثر تعقيدًا ، فإن الشيء الصحيح هو استخدام THREAD. نحن نحذرك من هذا ، لأن نظامنا يستخدم TTASK من Delphi لزيادة الأداء بشكل أساسي في بيئات أكثر تعقيدًا بالإضافة إلى توفير الموارد ، وإذا كنت تستخدم TTASK بشكل غير صحيح في الرموز الخاصة بك ، فيمكنك تجميد تطبيقك عند إرسال رسالة.
تم ترخيص رسائل IPUB بموجب معهد ماساتشوستس للتكنولوجيا ، ويتم تضمين ملف الترخيص في هذا المجلد.