برمجة متعددة الخيوط تحت DELPHI (1)
نحن نعلم أن نظامي Win95 أو WinNT كلاهما نظامي تشغيل "متعددي الخيوط"، وفي DELPHI 2.0، يمكننا الاستفادة الكاملة من هذه الميزة وكتابة تطبيقات "متعددة الخيوط".
بالنسبة لأولئك الذين كتبوا برامج تحت DOS أو نوافذ 16 بت في الماضي، لا تزال "تعدد العمليات" غير مألوفة، ولكن تمامًا كما انتقلنا من مهمة واحدة ضمن DOS إلى تعدد المهام ضمن Windows 3.1، يجب علينا الآن إجراء الانتقال مرة أخرى في مجال "الخيوط المتعددة"، بعد كل شيء، فإن عصر الكمبيوتر يتطور باستمرار. ومع ذلك، لحسن الحظ، البرمجة متعددة الخيوط ضمن DELPHI2.0 لا تتطلب منا أن نتعلم وظائف WIN32API الضخمة، يمكننا استخدام فئة TThread القياسية متعددة الخيوط ضمن DELPHI لإكمال عملنا.
TThread هي فئة مجردة، وهذا يعني أنه ليست هناك حاجة للإعلان عن المتغيرات بناءً على TThread (والمتغيرات المعلنة بناءً على TThread عديمة الفائدة تمامًا). ما يتعين علينا القيام به هو استخدام TThread كفئة أساسية وإنشائها شكل فئة فرعية. في الواقع، من السهل جدًا كتابة تطبيقات متعددة الخيوط بناءً على TThread.
ما يلي هو فئة أساسية متعددة الخيوط تم إنشاؤها عن طريق وراثة TThread.
QuerThrd. نظام تقييم الأداء
UnitQuerThrd;
واجهة
الاستخدامات
فئات،DBTables؛
يكتب
TQueryThreadΚclass(TThread)
خاص
fQuery:tQuery;
محمي
تنفيذ الإجراء؛ تجاوز؛
عام
buildorCreate(Suspending: Boolean; Query: TQuery);
نهاية؛
تطبيق
منشئ
TQueryThread. إنشاء (معلق: منطقي؛ الاستعلام: TQuery)؛
يبدأ
inheritedCreate(Suspending);
fQuery: ΚQuery;
FreeOnTerminate:ΚTrue;
نهاية؛
الإجراءTQueryThread. ينفذ؛
يبدأ
fQuery. يفتح؛
نهاية؛
نهاية.
في المثال البسيط أعلاه، قمنا بإنشاء فئة فرعية من TQuery-Thread من TThread لتنفيذ استعلامات قاعدة البيانات في الخلفية. في وظيفة الإنشاء لهذه الفئة، يتم تمرير معلمتين Suspension وQuery، حيث يتم استخدام Suspending للتحكم في تشغيل مؤشر الترابط. إذا كان Suspend صحيحًا، فسيتم تعليق مؤشر ترابط فئة TQueryThread مباشرة بعد إنشائه حتى استئناف. يتم تشغيل الطريقة. سيستمر تنفيذ مؤشر الترابط. يتم استخدام معلمة الاستعلام لقبول عنصر تحكم الاستعلام الموجود (عنصر تحكم الاستعلام الحقيقي في النموذج) لتشغيله في موقف متعدد الخيوط. التنفيذ هو العملية الأكثر أهمية، وهو جزء التنفيذ من فئة TQueryThread، ويجب كتابة جميع البيانات التي يجب تشغيلها في هذه الفئة متعددة الخيوط في هذه العملية.
في الواقع، عند إنشاء فئة متعددة الخيوط الخاصة بك، لا تحتاج إلى إدخال كل هذه الرموز. حدد الخيار الجديد ضمن قائمة ملف DELPHI، ثم حدد مشروع "TThreadObject"، وستقوم DELPHI ببناء وحدة البرنامج الأساسية لك. ومن ثم يمكننا إجراء التعديلات المقابلة حسب الحاجة.
تنفيذ العملية:
لنفترض أننا أنشأنا نموذج FORM1، الذي يحتوي على عنصر تحكم الاستعلام Query1 الذي سنستخدمه. ثم نقوم بإضافة وحدة QuerThrd المكتوبة أعلاه إلى جزء الاستخدامات من الوحدة.
الإجراءForm1. Button1Click(Sender: TObject);
يبدأ
{إنشاء عملية قيد التشغيل}
TQueryThread. إنشاء (خطأ، استعلام 1)؛
نهاية؛
إذا تم تنفيذ هذه العملية، فسيقوم عنصر تحكم الاستعلام Query1 الموجود في النموذج بتشغيل الاستعلام تلقائيًا في بيئة متعددة مؤشرات الترابط. لاحظ أنه لا يوجد سوى إنشاء ولكن ليس مجانيًا في فئة TQueryThread بعد إنشاء فئة ديناميكيًا ثم نسيان حذفها، يعد هذا أحد الأخطاء التي نرتكبها غالبًا، ومع ذلك، نظرًا لأننا حددنا FreeOnTerminate (الحذف بعد التشغيل) على أنه صحيح هنا، عند تنفيذ العبارة في التنفيذ بعد الانتهاء، سيتم تحرير عنصر التحكم في الذاكرة الذي تشغله فئة TQueryThread تلقائيًا.
ومع ذلك، هناك مشكلة أخرى تستحق اهتمامنا، نظرًا لأنه يمكن تشغيل عدة سلاسل رسائل في نفس الوقت، فيجب علينا أيضًا حل مشكلة المزامنة. إذا لم يكن هناك ارتباط بين عدة برامج متعددة الخيوط، فلن يكون هناك ارتباط بينها. أي صراع. ولكن في الواقع، قد يتم تشغيل العديد من تطبيقات قواعد البيانات متعددة الخيوط في نفس الوقت، نظرًا لأن موارد قاعدة البيانات نفسها تحتاج إلى المشاركة، نحتاج أيضًا إلى إضافة عنصر تحكم Tsession إلى Query1.
في الواقع، على الرغم من أننا ربما لم نستخدم تحكم الجلسة شخصيًا، في الواقع، ستقوم DELPHI تلقائيًا بإنشاء تحكم مؤقت في الجلسة أثناء جميع عمليات الوصول إلى قاعدة البيانات، وتحذفه ديناميكيًا بعد الاستخدام. في برمجة قاعدة البيانات العادية، لا نحتاج إلى القيام بذلك بأنفسنا، ولكن في حالة التنفيذ متعدد الخيوط لقاعدة البيانات، حتى لا تتعارض مع بعضها البعض، يجب علينا تخصيص التحكم في الجلسة الخاصة بنا لكل وصول إلى قاعدة البيانات. هذه الخطوة بسيطة للغاية، نحتاج فقط إلى إضافة عنصر تحكم الجلسة إلى النموذج، ثم كتابة اسم عشوائي لخاصيته "Sessionname"، ثم كتابة نفس الاسم في "Sessionname" الخاص بـ Query1. بهذه الطريقة يكون برنامج قاعدة البيانات الخاص بنا آمنًا.
هناك نوع آخر من مشكلات المزامنة التي تحتاج إلى حل وهي تلك البرامج التي تعمل على موارد VCL. وهناك العديد من هذه البرامج، ولكن لحسن الحظ فإن الحل بسيط جدًا أيضًا.
يمكننا أن ننظر إلى برنامج مثل هذا:
UnitBncThrd;
واجهة
الاستخدامات
WinProcs، Classes، Graphics، ExtCtrls؛
يكتب
TBounceThreadΚclass(TThread)
خاص
شكل: شكل؛
FXSpeed: عدد صحيح؛
FYSpeed: عدد صحيح؛
الإجراءMoveShape;
محمي
تنفيذ الإجراء؛ تجاوز؛
عام
buildorCreate(Suspused: Boolean; Shape: TShape; XSpeed, YSpeed: Integer);
propertyShape: TShaperreadFShape;
نهاية؛
تطبيق
الإجراءTBouad. this.MoveShape;
فار
MaxHeight، MaxWidth: عدد صحيح؛
يبدأ
withFShapedo
يبدأ
اليسار: ΚLeft+FXSpeed;
الأعلى: ΚTop+FYSpeed;
إذا (يسارΙ0) أو
(يسار + العرض Λ الوالد . العرض) ثم
FXSpeed: ΚFXSpeed*-1؛
إذا (TopΙ0) أو
(أعلى + ارتفاع Λ الجزء. الارتفاع) ثم
FYSpeed: ΚFYSpeed*-1؛
مدونة المؤلف: http://blog.csdn.net/zou5655/