#1
|
||||
|
||||
الدرس الثامن والأربعون : Multithreading - دورة .net 2008
بسم الله الرحمن الرحيم . السلام عليكم ورحمة الله وبركاته . تعرف نظم التشغيل الحديثة بأنها multitasking systems وهو ما يعني امكانية تنفيذ اكثر من مهمة في نفس الوقت ، لذا تجد أن بامكانك تشغيل عدة برامج في نفس الوقت . برامج .net من هذا النوع افتراضياً ، لكنك تلاحظ في بعض البرامج ان البرنامج الواحد قادر على تنفيذ اكثر من عملية في نفس الوقت دون أن يكون لهما تأثير متعارض ، هذا ما يعرف باسم multithreading . لذا تجد ان برنامج الماسنجر يتيح لك ارسال ملفات والحديث واستخدام الكاميرا والتحدث مع اكثر من شخص بنفس الوقت ، وهو ما لم يكن الماسنجر قادراً عليه لو لم يكن يفصل هذه المهام داخل البرنامج الواحد عن بعضها ، هذا هو مضمون درسنا الحالي . جميع الأوامر التي سنتعامل معها هنا تقع تحت نطاق الأسماء System.Threading ، لذا قم باستيراده أولاً . العناصر الاساسية داخل مجال الاسماء هذا هي : Thread : لتعريف Thread جديد والتعامل معه . ThreadPool : مجموعة من ال Threads يمكن لها التعامل فيما بينها . ThreadState : Enum يحتوي على عدة حالات لأي Thread . ThreadStart : بدء التنفيذ في Thread . ThreadPriority : تحديد اولوية هذا ال Thread . بالاضافة إلى : Semaphore Mutex Monitor وهي في الاساس الجوريزمات تستخدم لعمليات التزامن synchronization بحيث لا يسمح لأكثر من Thread بالوصول إلى نفس المصادر في نفس الوقت ، لمزيد من التعرف على هذه الالجوريزمات يمكن البدء من هنا : [IMG]http://en.wikipedia.org/wiki/Semaphore_(programming[/url]) http://en.wikipedia.org/wiki/Mutual_exclusion http://en.wikipedia.org/wiki/Monitor_(synchronization) System.Threading.Thread الفئة الاساسية في مجال الاسماء هذا ، تتيح لنا انشاء threads وتنفيذ مهامنا المختلفة عليها ، مكونات هذه الفئة الاساسية هي : Sleep() : توقف عمل ال thread لفترة من الوقت . IsAlive : قيمة توضح إذا كان ال thread ما زال يعمل ام لا . IsBackground : إذا كان ال thread يعمل في background . Priority : الأولوية الحالية . ThreadState : حالة ال Thread . Name : اسم ال thread . Abort() : خروج . Join() : توقف عمل ال thread حتى حدوث الحدث في join . Resume() : استئناف العمل بعد ايقافه . Start() : بدء العمل للمرة الأولى . Suspend() : ايقاف العمل مؤقتاً . سنقوم بداية بعمل تجربة سريعة للاستدلال على معنى ان يتم تنفيذ مهمتين في نفس الوقت ، نعود بعدها لاستئناف شرح المفاهيم الخاصة بالموضوع . قم بتجربة الكود التالي : c#: كود PHP:
كود PHP:
http://vb4arab.com/vb/uploaded/3/012...28computing%29 نعود مرة أخرى ، لتحديد Priority أي مهمة لدينا نستخدم ال enum التالي : كود PHP:
كود PHP:
ParameterizedThreadStart : لعلك لاحظت في المثال السابق اننا نمرر الدالة ومن ثم نقوم بعمل start لها لتنفيذها في thread منفصل ، لكن ماذا لو كانت هذه الدالة تستقبل بارميترات ؟ الحل بسيط ، باستخدام ParameterizedThreadStart بالشكل التالي مثلاً : c#: كود PHP:
كود PHP:
ForeGround Thread : هذا يعني ان البرنامج لا يمكن ان يغلق حتى يتم الانتهاء من تنفيذ جميع ال foreground threads الموجودة فيه ، النوع الافتراضي لأي thread تقوم بانشاءه هو من هذا النوع . BackGround Thread : هذا يعني ان البرنامج يمكن ان يتم اغلاقه حتى لو لم يتم تنفيذ كافة ال background threads ، يتم عمله بالشكل التالي مثلاً : كود PHP:
بصراحة كنت انوي كتابة موضوع كامل عن ال Threads Synchronization ، ولكني لم اجد نفسي قادراً على اضافة أي جديد في هذا الموضوع لمقال الاخ محمد سامر سلو على هذا الرابط : http://vb4arab.com/vb/showthread.php?t=6341 لذا يمكنك متابعة الدرس من هناك ، ثم العودة إلى هنا مرة أخرى . الدرس الذي بعده كان ايضاً عن ال Threadbool ، موجود هنا أيضا للأخ محمد : http://vb4arab.com/vb/showthread.php?t=6340 الدرس بالفيجوال بيسك.نت ، إذا كنت ترغب في العرض باستخدام c# يمكنك التحويل من هنا . http://labs.developerfusion.co.uk/co...arp-to-vb.aspx لذا سآخد راحة اليوم ، نلتقي غداً مع BackgroundWorker وبعدها تعقيب للأخ supersmart . BackgroundWorker : تستخدم ال BackgroundWorker لتنفيذ مهمة معينة تأخذ وقتاً طويلاً بعيداً عن المسار الاساسي للبرنامج ، من أمثلة ذلك الدوال الخاصة بالقراءة من web service أو عمليات معالجة الصور او جلب بعض البيانات من كومبيوتر آخر أو تنفيذ عملية بحث ، او اجراء مجموعة من العمليات طويلة الأمد . ومع أنك كان بإمكانك عمل هذه الدوال عن طريق تنفيذها في thread تقليدي ، إلا أن BackgroundWorker تعطيك مزيد من التحكم ، ببساطة يمكنك اخباره ال بالدالة التي ترغب في تنفيذها ومن ثم تشغيلها عن طريق RunWorkerAsync() ، أخيراً بعد انتهاء التنفيذ يتم تنفيذ حدث RunWorkerCompleted والتي يمكنك فيه مثلاً عرض النتائج بعد انتهاء تنفيذ هذه المهمة . للبدء بالعمل قم بعمل Windows Form ، قم برسم بعض الادوات ومن ثم ضع زر امر للبدء بتنفيذ المهمة ، واخيراً قم بسحب أداة BackgroundWorker بالشكل التالي مثلاً : [url]http://vb4arab.com/vb/uploaded/3/01210353005.jpg[/IMG] أهم دالتين هما هنا DoWork والذي يتم استدعاءه وقت بدء التنفيذ ، والحدث RunWorkerCompleted والذي يتم اطلاقه بعد الانتهاء من التنفيذ بالشكل التالي مثلاً : C#: كود PHP:
كود PHP:
كود PHP:
والله الموفق ... والسلام عليكم ورحمة الله وبركاته .
|
#2
|
||||
|
||||
|
|
|
المواضيع المتشابهه | ||||
الموضوع | كاتب الموضوع | المنتدى | مشاركات | آخر مشاركة |
الدرس الثامن والخمسون : Wpf 3d - دورة .net 2008 | khaledbelal | دورة .NET 2008 من منتدى فيجوال بيسك للعرب | 0 | 03-07-2010 02:19 AM |
الدرس التاسع والأربعون : System.IO - دورة .net 2008 | khaledbelal | دورة .NET 2008 من منتدى فيجوال بيسك للعرب | 0 | 02-28-2010 10:15 PM |
الدرس الثاني والأربعون : ال Gc دورة .net 2008 | khaledbelal | دورة .NET 2008 من منتدى فيجوال بيسك للعرب | 0 | 02-26-2010 04:17 PM |
الدرس الثامن والثلاثون : Lambda Expressions دورة .net 2008 | khaledbelal | دورة .NET 2008 من منتدى فيجوال بيسك للعرب | 0 | 02-25-2010 02:54 PM |
الدرس الثامن والعشرون : ICloneable interface دورة .net 2008 | khaledbelal | دورة .NET 2008 من منتدى فيجوال بيسك للعرب | 0 | 02-24-2010 02:22 PM |