![]() |
|
الفصل(16): مدخل لمسارات التنفيذ Threading - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : الأقسام التعليمية - المنتدى القديم (http://vb4arb.com/vb/forumdisplay.php?fid=90) +--- قسم : قسم دورات المنتدى (http://vb4arb.com/vb/forumdisplay.php?fid=113) +---- قسم : دورة تعليم البرمجة باستخدام VB.net, (http://vb4arb.com/vb/forumdisplay.php?fid=129) +---- الموضوع : الفصل(16): مدخل لمسارات التنفيذ Threading (/showthread.php?tid=4388) |
الفصل(16): مدخل لمسارات التنفيذ Threading - B3dak Hbebe - 23-09-12 السلام عليكم ورحمة الله وبركاته في هذا الفصل سنتطرق لموضوع نال أهمية واضحة في عالم الدوت نت سأتطرق لعدة أمثلة توضح مضمون فصلنا لهذا اليوم إن شاء الله ملاحظة : بعض الأمثلة اقتبستها من مصادر أخرى لوضوحها لنأخذ مثلا برنامج الوورد.. نعرف جميعا أن برنامج الوورد يقوم بعملية التدقيق الإملائي وعند كتابة أي كلمة يقوم الورد بالبحث عنها في معجمه وإن لم يجدها يخبرك بأنها خاطئة في الحقيقة عملية البحث في معجم يحتوي على كم هائل من الكلمات عملية ليست بالبسيطة وتستغرق وقت ومصادر ليست بالقليلة.. وإن كان الأمر أن يقوم البرنامج بعملية تدقيق بعد كل حرف - وهذا ما يحدث فعلا - بتفكيرنا وعلمنا الضيق بواسطة برنامج واحد لمكثنا وقتا طويلا في كتابة جملة واحدة فقط وهنا تأتي فكرة التطبيقات متعددة مسارات التنفيذ حيث تم إنشاء مسار خاص بالمدقق وحده بشكل لا يؤثر على عمل البرنامج. إن لم تتضح الفكرة بالمثال السابق لنتناول المثال التالي: مضادات الفيروسات تقوم بالكثير من المهام في نفس الوقت ( مراقبة المنافذ وفحص الملفات و تحديثات للبرنامج ووو) من البديهي جدا أن كل ذلك لا يتم في مسار واحد وإلا لما استطاع البرنامج القيام بهذه المهام في ذات الوقت. الآن أتمنى أن تكون الفكرة قد وصلت ولندخل لموضوعنا بإذن الله. في بادئ الأمر دعني أناقش معك المثال التالي من باب التوضيح: الآن قم بانشاء مشروع جديد وضع فيه بوتون واحد وأداة Label وأداة تايمر دعنا نقوم بعملية ربط نصوص في حلقة تكرارية ل 100000 مرة. كود : [align=left]نفذ البرنامج واضغط على البوتون الذي وضعته. ستجد أن البرنامج توقف عن الاستجابة لثوان عديدة مما سيثير استفزاز المستخدم وسبب التوقف - لم يتوقف فعلا - أن البرنامج مشغول ب100000 عملية ربط نصوص لتفادي هذه المشكلة دعنا نجعل تنفيذ عملية الربط في مسار آخر حتى لا يؤثر ذلك على عمل البرنامج ومن هنا يستدعي الأمر الإعلان عن Thread جديد في البداية قم باستيراد مجال الأسماء System.Threading كود : [align=left] [color=#000000] [COLOR=#0000BB]Imports System[/color][color=#007700].[/color][COLOR=#0000BB]Threading الآن نقوم بتعريف كائن جديد من نوع Thread كود : [align=left][color=#000000][COLOR=#0000BB] [COLOR=#000000] [COLOR=#0000BB]Dim NewThread [/color][color=#007700]As New [/color][color=#0000BB]Thread[/color][color=#007700]([/color][color=#0000BB]AddressOf DoIt[/color][color=#007700]) [/color][/COLOR]تجد أنه من الضروري تمرير وسيط باستخدام الكلمة المحجوزة AddressOf وفي المثال التعليمة السابقة مررنا له إجراء DoIt وهذا الإجراء الذي قمنا بتمريره قبل قليل كود : [align=left][color=#000000][COLOR=#0000BB] Sub DoIt[/color][COLOR=#007700]()تجد أننا قمنا بعملية الربط داخل الإجراء DoIt لتنفيذ الThread الذي أعلنا عنه (NewThread) استخدم الطريقة Start كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Start[/color][color=#007700]()[/color][/COLOR]الآن بعد تشغيل المسار الآخر دعنا نراقب ما وصلت إليه عملية الربط باستخدام تايمر جديد وهذا الكود بشكله النهائي للمثال الأخير لربط المفاهيم بعضها ببعض كود : [align=left][color=#000000][COLOR=#0000BB] Dim MyString [/color][color=#007700]As [/color][color=#0000BB]String [/color][color=#007700]= [/color][COLOR=#DD0000]""بهذا إن شاء الله نكون أتممنا توضيح مفهوم الThreads نأتي الآن لطرق الThread
كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Start[/color][COLOR=#007700]()
كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Abort[/color][COLOR=#007700]()
كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Suspend[/color][color=#007700]() [/color][/COLOR]
كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Resume[/color][COLOR=#007700]()
كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Sleep[/color][color=#007700]([/color][color=#0000BB]1000[/color][color=#007700]) [/color][color=#0000BB]Will Suspend [/color][color=#007700]for [/color][COLOR=#0000BB]1 second يمكننا التحكم بالمسار الحالي من خلال كود : [align=left] [color=#000000] [COLOR=#0000BB]Thread[/color][color=#007700].[/color][COLOR=#0000BB]CurrentThread مثال: كود : [align=left] [color=#000000] [COLOR=#0000BB]Thread[/color][color=#007700].[/color][color=#0000BB]CurrentThread[/color][color=#007700].[/color][color=#0000BB]Abort[/color][COLOR=#007700]() ونأتي لخاصية من خواص الThread IsAlive() كود : [color=#007700]If [/color][color=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]IsAlive[/color][color=#007700]() [/color][COLOR=#0000BB]Thenقرأت عبارة في كتاب الاستاذ تركي العسيري طريفة كود : من الغباء الاستعلام عن الخاصية IsAlive لمسار التنفيذ الحالي:[align=left] If Thread.CurrentThread.IsAlive() Then ......طبعا تعرفوا السبب ! أيضا يمكن إسناد اسم لكل مسار تنفيذ ما يساعدك على مراقبة عمل برنامج بدقة كود : [align=left] [color=#000000] [COLOR=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]Name [/color][color=#007700]= [/color][COLOR=#DD0000]"My Thread" أيضا يمكنك معرفة حالة الThread باستخدام الخاصية ThreadState كود : [align=left] [color=#000000] [COLOR=#0000BB][/color][color=#007700]If [/color][color=#0000BB]NewThread[/color][color=#007700].[/color][color=#0000BB]ThreadState [/color][color=#007700]= [/color][color=#0000BB]ThreadState[/color][color=#007700].[/color][color=#0000BB]Running Then[/color][COLOR=#007700]..... والحالات التي يمكن أن تصادف الThread هي ThreadState.Aborted
ThreadState.AbortRequested ThreadState.Background ThreadState.Running ThreadState.Stopped ThreadState.StopRequested ThreadState.Suspended ThreadState.SuspendRequested ThreadState.Unstarted ThreadState.WaitSleepJoin نأتي لنقطة أخيرة في فصلنا لهذا اليوم يمكن تعيين الأفضلية للمسارات باستخدام الخاصية Priority وبها خمس تعيينات
بهذا نتمم فصلنا لهذا اليوم والسلام عليكم إخوانكم Lo2i و Mohammed Asaad الفصل(16): مدخل لمسارات التنفيذ Threading - B3dak Hbebe - 23-09-12 س 1 : إقتباس :ممكن توضح الفرق بين هذا الكود وبين طريقة استعمال ال thread لديك ج 1 : لن تلاحظ فرق لأنك لم تفهم الغرض من تعدد المسارات Multithrading. طبعاً هناك فرق فالكود الذي وضعته يقوم باستخدام المسار Thread الأساسي وعادة ما يكون مسار واجهة الاستخدام UI Thread من أجل تنفيذ الكود الذي بداخل الحلقة ولن يتم تنفيذ أي قطعة كود أخرى إلا بعد الانتهاء من الحلقة. يعني أن البرنامج مجبر على انتظار انتهاء الحلقة ولن يستطيع تنفيذ أي مهمة أخرى إلا بعد انتهاء الحلقة التكرارية. أما عندما تستخدم Thread مختلف عن UI Thread فهذا يعني أنه باستطاعتك تنفيذ أكثر من قطعة كود في نفس الوقت بالتزامن مع المسار الأساسي للتطبيق UI Thread الفصل(16): مدخل لمسارات التنفيذ Threading - abdoojh - 25-02-13 الان وبحمد الله وفضله اكملت دراسة جميع الفصول بارك الله فيك اخي وفي كل من ساهم في هذه الدروس وأسأل الله ان يجزيكم خير الجزاء الفصل(16): مدخل لمسارات التنفيذ Threading - خليل اسماعيل - 27-04-13 بارك الله فيك |