دلفي & threads مفاهيم و تطبيقات .
#11
السلام عليكم ورحمة الله وبركاته .

يمكن تفادي Synchronization باستعمال ال PostMessage و SendMessage و هنا سوف يتدخل النظام و يصبح هو المتحكم في عمليات ال In/Out لل Thread و هو احسن شئ يمكن استعماله مع ال Thread و هذا سيكون بتعامل مع LPARAM و WPARAM .
انا متاكد ان اخي TF6M سوف يتطرق لها في بقية الدرس ان شاء الله و هو مشكور على هذا .
الرد
#12
بسم الله الرحمان الرحيم

- لإنشاء thread توفر دلفي صنف TThread لتحقيق ذلك , دون اللجوء الى WinApi , تعرض عدة خصائص
لتسهيل التعامل مع الـ Thread , تتمثل في :

Create/Destroy: كـ Constructor /Destructor .

Execute: يحتوى على الكود الذي سينفذه الثريد , كما يجب التحقق بصفة دورية الخاصية Terminted , لأنه في حالة إقاف عمل الثريد
بواسطة الخاصية Terminate , يجب علينا إيقاف التنفيذ أو معالجة الكود الذي تنفذه الخاصية Execute .

Synchronize: هذه الخاصية لها باراماتر وحيد , يحتوي على إسم إجراء/دالة معرفة في وحدة البرنامج , تستخدم لتجنب
التداخلات التي يمكن أن تحدث في حال وجود أكثر من thread شغال في آن واحد , أو عدة إجراءات/دوال من VCLs كلها تتعامل
مع متغيرات عامة , قابلة للتغير من أي قسم من أقسام البرنامج .
- في حالة إستخدامنا لأكثر من Synchronize ستكون نسبة تعرضنا لحالة توقف تام للبرنامج كبيرة جدا .
- الجدول التالي يوضح فكرة التداخل في حالة أكثر من ثريد شغال يستخدمان نفس المصادر (متغيرات عامة) :

[صورة: 56555.gif]

- يجب أن يكون هناك تزامن في تنفيذ التعليمات بين الثريد X,Y و إلا سيحدث تداخل أثناء معالجة تعليمات كليهما , مثلا التعليمة رقم 3
للثريد X تقوم بفتح الملف F للقراءة فقط , و التعليمة رقم 2 للثريد Y تقوم بالكتابة في F , هناك طرق لتفادي هذه المشكلة كإستخدام الصنف
TCriticalSection الذي يمنع الولوج لقسم معين من الكود (الدي نريد حمايته) و حجبه عن الـ Threads الأخرى ,
أيضا هناك دوال Apiتقوم بنفس الدور (InitializeCriticalSection, LeaveCriticalSection...إلخ) .

WaitFor: لعمل الـ Switch بين threads , مثال لدينا ثريد X و ثريد Y , X ينتظر الـ WaitFor الخاصة بـ Y ليبدأ العمل و هكذا ,
يجب مراعات الـ Synchronize الخاصة بـ X&Y , لانه أي خلل منطقي سيوقف البرنامج حالا ,
البديل بإستعمال دوال Api بما يسمى بـ Wait Functions كـ (WaitForSingleObject, WaitForMultipleObjects ....إلخ) .

Terminate/Suspend/Resum: واضحة من إسم الخاصية , إيقاف الثريد نهائيا , تعطيل الثريد (إيقاف لحظي) , متابعة عمل الثريد أين تم تعطيله .

التطبيق الثالث :

- التحكم في 3 ثريد , A,B&C مع إستخدام TCriticalSection لحماية المتغير Gvar , كما يعد خلاصة كل ما سبق !.

[صورة: 56521.gif]

بالتوفيق ,,


الملفات المرفقة
.rar   MultiThread.rar (الحجم : 17.05 ك ب / التحميلات : 136)
I'M Fly Like A G6

الرد
#13
يمكن تجميد (Lock) الـ Thread ثم إعادة تشغيله (UnLock) لإنجاز أشغال معينة باستخدام TCriticalSection، أو لمجرد Sleep زمني...
مثال:
PHP كود :
uses
  SyncObjs
;

// one lock for each independent resource
var
  
myLock : TCriticalSection;

// early during application startup:
myLock := TCriticalSection.Create;

procedure TMyThread.Execute;
begin
  
//... lock it
  
myLock.Acquire;

  
// use the shared resource

  // unlock it..
  
myLock.Release;
end; 
Acquire (أو Enter أيضا) بلغة API هي EnterCriticalSection وتستخدم للتجميد
Release هي LeaveCriticalSection لفك الحصار وإطلاق سراح الـ Thread
بارك الله لك أخي TF6M
بالتوفيق.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#14
كود :
Procedure A or B or C.Execute; Begin FreeOnterminate:= False;

نحاول قدر المستطاع الابنعاد عن هذا الاسلوب في النصريح بال :
كود :
FreeOnterminate:= False / true
و ال Thread في حالة التنفيذ .

والسلام عليكم و رحمة الله و بركاته
الرد
#15
مكتبة DLLThreadSynchronize لتسهيل Synchronization مع الـ Threads من خلال DLL
التعليقات بالفرنسي، منقولة للفائدة Smile.


الملفات المرفقة
.rar   DLLThreadSynchronize.rar (الحجم : 2.45 ك ب / التحميلات : 87)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
[-] كل من 1 user says قال شكرا ل kachwahed على المشاركة المفيدة
  • annabil23
الرد
#16
السلام عليكم
الظاهر أن الجميع يشارك في الموضوع ما شاء الله
إن أمكن إخواني الكرام وضع تعليقات على كل سطر من الكود، فهاذا سيساعدني و يساعد المبتدئين مثيل لضم مفهوم الدرس بسرعة
و جزاكم الله كل خير و فتح لكم أبواب الخير
الرد
#17
بسم الله الرحمان الرحيم
السلام عليكم و رحمة الله و بركاته

نقوم بإنشاء برنامج , يشغل ثريد a و b في نفس الوقت ؟ , هنا تتم زيادة نسبة :frusty: , لأنه من الممكن أن يتم خطأ في توقيت الـ سويتش بين a ,b .
يمكن أن نظيف حماية للمتغيرات التي من الممكن أن يتم الولوج إليها من أي قسم من أقسام البرنامج (
TCriticalSection) ,
لكن أيضا من الممكن أن ننتظر إنتهاء تنفيذ
a , لنتيح المجال لتنفيذ b بعد التأكد نهائيا من إنتهاء a ليكون برنامجنا أكثر أمانا ! .

التطبيق الرابع :

1- يقوم A بإيقاف البرنامج مدة 5 ثواني .
2- يقوم B بإنتظار A حتى إنتهاء تنفيذه , بعدها يبدأ B في العمل .
Not Waiting : تنفيذ .
Waiting : إنتظار , (لم يبدأ في التنفيذ فعليا).

[صورة: 453543.gif]

برنامج ينفذ 2 Threads في وقت واحد , بإستعمل دالة WaitForSingleObject, كملاحظة نستعمل
[FONT=Tahoma]WaitForMultipleObjects في حالة وجود أكثر من 2 Threads ؟.
شرح دالة WaitForSingleObject من هنا .

بالتوفيق ,,



الملفات المرفقة
.rar   Using THreads[04].rar (الحجم : 1.68 ك ب / التحميلات : 117)
I'M Fly Like A G6

الرد
#18
بسم الله الرحمان الرحيم
السلام عليكم و رحمة الله و بركاته


هده المشاركة لا تحتاج توضيح , كل ما في المثال عبارة عن إنشاء thread و تنفيذه , بالإعتماد على دوال
الـ Apis , إن لم يكن الكود واضح إبحث عن وظيفة هذه الدوال في
MSDN , مثلا ؟؟ :

PHP كود :
- CreateThread/OpenThread == Constructor .
- 
CloseHandle/TerminateThread == Terminate/Free .
- 
ResumeThread/SuspendThread == Suspend/Resume .
- 
Wait Functions .
- 
EnterCriticalSection/LeaveCriticalSection == TCriticalSection . 

التطبيق الخامس :

تطبيق بسيط يوضح إستخدام Apis , لإنشاء thread و التحكم به مباشرة ! .

[صورة: 546851.gif]

بالتوفيق ,,


الملفات المرفقة
.rar   Using THreads[05].rar (الحجم : 1.7 ك ب / التحميلات : 130)
I'M Fly Like A G6

الرد
#19
شكرا على الموضوع الرائع.
لقد لاحظت وجود مشكل و هو حين الضغط على start مرتين او اكثر تزيد سرعة العداد
الحمد لله، الحمد لله، الحمد لله.
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم