عند كتابة تطبيقات متعددة الخيوط، فإن الشيء الأكثر أهمية هو التحكم في الوصول المتزامن إلى الموارد بين الخيوط لضمان التشغيل الآمن للخيوط. يوفر Win 32 API مجموعة من كائنات المزامنة، مثل Semaphore وMutex وCritical section وEvent لحل هذه المشكلة.
تقوم دلفي بتغليف كائنات الأحداث وكائنات القسم الحرج في كائنات Tevent وكائنات TcriticalSection على التوالي، مما يجعل استخدام هذين الكائنين بسيطًا ومريحًا. ومع ذلك، إذا كنت تريد استخدام كائنات مثل الإشارات أو كائنات المزامنة في برنامج دلفي، فيجب عليك اللجوء إلى وظائف Win32 API المعقدة، وهو أمر غير مناسب جدًا للمبرمجين الذين ليسوا على دراية بوظائف Win32 API. ولذلك، استخدم المؤلف دلفي لإنشاء فئتين لتغليف كائنات الإشارة وكائن المزامنة (TSemaphore وTMutex على التوالي)، على أمل أن يكون ذلك مفيدًا لغالبية مبرمجي دلفي.
1. هيكل الفصل
نقوم أولاً بتجريد كائن الإشارة وكائن المزامنة لواجهة برمجة تطبيقات Win32، وإنشاء فئة أصل ThandleObjectEx، ثم نشتق فئتين فرعيتين Tsemphore وTmutex من هذه الفئة الأصلية.
الكود المصدري للفئة هو كما يلي:
وحدة SyncobjsEx؛
واجهة
يستخدم Windows، الرسائل، SysUtils، Classes، Syncobjs؛
يكتب
THandleObjectEx = فئة (THandleObject)
// ThandleObjectEx هي الفئة الأصلية لفئة الاستبعاد المتبادل وفئة الإشارة
محمي
مقبض: مقبض؛
خطأ خطأ: عدد صحيح؛
عام
تدمير المدمرة؛
إصدار الإجراء؛ تجاوز؛
وظيفة WaitFor(Timeout: DWord): TWaitResult;
الخاصية LastError: عدد صحيح يقرأ FLastError؛
مقبض الخاصية: قراءة Thandle FHandle؛
نهاية؛
TMutex = class(THandleObjectEx)// فئة حصرية متبادلة
عام
إنشاء المنشئ(MutexAttributes: PSecurityAttributes; PrimaryOwner: Boolean; const Name:string);
تجاوز الإجراء؛
نهاية؛
TSemaphore = فئة (THandleObjectEx)
// فئة ضوء الإشارة
عام
إنشاء المنشئ (SemaphoreAttributes: PSecurityAttributes؛InitialCount: Integer؛MaximumCount: عدد صحيح؛ اسم ثابت: سلسلة)؛
الإجراء Release(ReleaseCount: Integer=1;PreviousCount:Pointer=nil overload);