delphi4arab منتديات دلفي للعرب
دلفي & threads مفاهيم و تطبيقات . - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي التقنية (https://delphi4arab.net/forum/forumdisplay.php?fid=6)
+--- قسم : دلفي والتعامل مع النظام و الذاكرة (https://delphi4arab.net/forum/forumdisplay.php?fid=20)
+--- الموضوع : دلفي & threads مفاهيم و تطبيقات . (/showthread.php?tid=1773)

الصفحات: 1 2


دلفي & threads مفاهيم و تطبيقات . - mohfa - 12-03-2010

السلام عليكم ورحمة الله وبركاته .

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



دلفي & threads مفاهيم و تطبيقات . - TF6M - 14-03-2010

بسم الله الرحمان الرحيم

- لإنشاء 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]

بالتوفيق ,,



دلفي & threads مفاهيم و تطبيقات . - kachwahed - 14-03-2010

يمكن تجميد (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
بالتوفيق.



دلفي & threads مفاهيم و تطبيقات . - mohfa - 14-03-2010

كود :
Procedure A or B or C.Execute; Begin FreeOnterminate:= False;

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

والسلام عليكم و رحمة الله و بركاته


دلفي & threads مفاهيم و تطبيقات . - kachwahed - 15-03-2010

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



دلفي & threads مفاهيم و تطبيقات . - paix144 - 15-03-2010

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


دلفي & threads مفاهيم و تطبيقات . - TF6M - 25-03-2010

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

نقوم بإنشاء برنامج , يشغل ثريد 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 من هنا .

بالتوفيق ,,




دلفي & threads مفاهيم و تطبيقات . - TF6M - 26-03-2010

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


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

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

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

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

[صورة: 546851.gif]

بالتوفيق ,,


دلفي & threads مفاهيم و تطبيقات . - karamofweb - 10-07-2011

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