مثير للإعجاب

مؤشرات الترابط ومزامنة واجهة المستخدم الرسومية في تطبيق دلفي

مؤشرات الترابط ومزامنة واجهة المستخدم الرسومية في تطبيق دلفي


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

يتيح لك تعدد الخيوط في دلفي إنشاء تطبيقات تتضمن عدة مسارات متزامنة للتنفيذ.

تطبيق دلفي العادي ذو ترابط واحد ، مما يعني أن جميع كائنات VCL يمكنها الوصول إلى خصائصها وتنفيذ أساليبها داخل هذا الموضوع الفردي. لتسريع معالجة البيانات في التطبيق الخاص بك ، قم بتضمين واحد أو أكثر من سلاسل العمليات الثانوية.

المواضيع المعالج

ا خيط هي قناة اتصال من تطبيق إلى معالج. تحتاج البرامج أحادية الارتباط إلى تدفق الاتصالات في كلا الاتجاهين (من وإلى المعالج) أثناء تنفيذه ؛ يمكن للتطبيقات متعددة الخيوط فتح العديد من القنوات المختلفة ، وبالتالي تسريع التنفيذ.

المواضيع و GUI

عندما يتم تشغيل عدة سلاسل عمليات في التطبيق ، فإن السؤال الذي يطرح نفسه هو كيف يمكنك تحديث واجهة المستخدم الرسومية الخاصة بك نتيجة لتنفيذ سلسلة الرسائل. الجواب يكمن في فئة TThread تزامن طريقة.

لتحديث واجهة مستخدم التطبيق الخاص بك ، أو سلسلة الرسائل الرئيسية ، من سلسلة رسائل ثانوية ، تحتاج إلى استدعاء طريقة المزامنة. هذه التقنية عبارة عن طريقة آمنة لمؤشر الترابط تتجنب تعارضات مؤشرات الترابط المتعددة التي يمكن أن تنشأ من الوصول إلى خصائص الكائن أو الطرق غير الآمنة لمؤشر الترابط أو استخدام موارد غير موجودة في مؤشر الترابط الرئيسي للتنفيذ.

يوجد أدناه مثال توضيحي يستخدم عدة أزرار مع أشرطة تقدم ، يعرض كل شريط تقدم "الحالة" الحالية لتنفيذ سلسلة العمليات.

وحدة MainU ؛
جهة تعامل
الاستخدامات
Windows ، الرسائل ، SysUtils ، المتغيرات ، الفصول ، الرسومات ، عناصر التحكم ، النماذج ،
مربعات الحوار ، ComCtrls ، StdCtrls ، ExtCtrls ؛
نوع
// فئة اعتراضية
TButton = class (StdCtrls.TButton)
OwnedThread: TThread؛
ProgressBar: TProgressBar؛
النهاية؛
TMyThread = class (TThread)
نشر
FCounter: عدد صحيح
FCountTo: عدد صحيح
FProgressBar: TProgressBar؛
FOwnerButton: TButton؛
الإجراء DoProgress ؛
الإجراء SetCountTo (const القيمة: عدد صحيح) ؛
الإجراء SetProgressBar (قيمة const: TProgressBar) ؛
الإجراء SetOwnerButton (القيمة const: TButton) ؛
محمي
تنفيذ الإجراء ؛ تجاوز؛
عامة
إنشاء المنشئ (CreateSuspended: Boolean) ؛
خاصية CountTo: عدد صحيح قراءة FCountTo إرسال SetCountTo؛
خاصية ProgressBar: قراءة TProgressBar FProgressBar إرسال SetProgressBar؛
PropertyButton: قراءة TBTton FOwnerButton إرسال SetOwnerButton؛
النهاية؛
TMainForm = فئة (TForm)
Button1: TButton ؛
ProgressBar1: TProgressBar؛
Button2: TButton ؛
ProgressBar2: TProgressBar؛
Button3: TButton.
ProgressBar3: TProgressBar؛
Button4: TButton.
ProgressBar4: TProgressBar؛
Button5: TButton ؛
ProgressBar5: TProgressBar؛
الإجراء Button1Click (المرسل: TObject) ؛
النهاية؛
فار
MainForm: TMainForm؛
التنفيذ
{$ R * .dfm}
{TMyThread}
constructor TMyThread.Create (CreateSuspended: Boolean)؛
ابدأ
وارث؛
FCounter: = 0 ؛
FCountTo: = MAXINT؛
النهاية؛
الإجراء TMyThread.DoProgress؛
فار
PctDone: الموسعة.
ابدأ
PctDone: = (FCounter / FCountTo) ؛
FProgressBar.Position: = Round (FProgressBar.Step * PctDone)؛
FOwnerButton.Caption: = FormatFloat ('0.00٪'، PctDone * 100)؛
النهاية؛
الإجراء TMyThread.Execute ؛
CONST
الفاصل الزمني = 1000000 ؛
ابدأ
FreeOnTerminate: = True؛
FProgressBar.Max: = FCountTo div Interval؛
FProgressBar.Step: = FProgressBar.Max؛
بينما FCounter <FCountTo القيام به
ابدأ
إذا كان FCounter mod Interval = 0 ، فقم بالمزامنة (DoProgress) ؛
Inc (FCounter) ؛
النهاية؛
FOwnerButton.Caption: = 'Start'؛
FOwnerButton.OwnedThread: = لا شيء ؛
FProgressBar.Position: = FProgressBar.Max؛
النهاية؛
الإجراء TMyThread.SetCountTo (const القيمة: عدد صحيح) ؛
ابدأ
FCountTo: = القيمة ؛
النهاية؛
الإجراء TMyThread.SetOwnerButton (قيمة const: TButton) ؛
ابدأ
FOwnerButton: = القيمة ؛
النهاية؛
الإجراء TMyThread.SetProgressBar (قيمة const: TProgressBar) ؛
ابدأ
FProgressBar: = القيمة ؛
النهاية؛
الإجراء TMainForm.Button1Click (المرسل: TObject) ؛
فار
aButton: TButton؛
aThread: TMyThread ؛
aProgressBar: TProgressBar؛
ابدأ
aButton: = TButton (Sender)؛
إن لم يكن تعيين (aButton.OwnedThread) ثم
ابدأ
aThread: = TMyThread.Create (صواب) ؛
aButton.OwnedThread: = aThread؛
aProgressBar: = TProgressBar (FindComponent (StringReplace (aButton.Name، 'Button'، 'ProgressBar'،)))؛
aThread.ProgressBar: = aProgressBar؛
aThread.OwnerButton: = aButton؛
aThread.Resume.
aButton.Caption: = 'Pause'؛
النهاية
آخر
ابدأ
إذا aButton.OwnedThread.Suspended ذلك الحين
aButton.OwnedThread.Resume
آخر
aButton.OwnedThread.Suspend.
aButton.Caption: = 'Run'؛
النهاية؛
النهاية؛
النهاية.

شكرًا لـ Jens Borrisholt على إرسال نموذج التعليمات البرمجية هذا.


Video, Sitemap-Video, Sitemap-Videos