تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس 13- Multi-Threading
#1
[b]كاتب الموضوع : Tarek Aldwire

[/b]السلام عليكم ورحمة الله وبركاته...

في درسنا اليوم سوف ندرس ال Multi-Threading (( المسارات المتعددة )) وهي مهمة جدا لأي برنامج يحوي على عمليات خارجية مثل القيام بفحص للفيروسات من قبل برنامج Anti-Virus أو جلب أسماء ملفات ما وما شابه ذلك...

سوف نستخدم في هذا الدرس المجال
System.Threading.Thread
لذلك قم من الان باستيراده

تبيين فائدة ال Multi-Threading ...

سوف أقوم بمقارنة مباشرة لذلك أولا سوف نستخدم برنامج لجلب أسماء الملفات بنفس الThread قم سوف نقوم ببرنامج اخر يقوم بنفس الوظيفة ولكن يستخدم Multi-Threading ...
وسوف يقوم البرنامج بعد جلب أسماء الملفات بكتابتها في ملف نصي...

البرنامج الأول: ( Single Threading ):

قم بإنشاء مشروع WindowsFormsApplication جديد وضع به Button

الكود البرنامج بعض وضع الأداة كاملا (( للإختصار )):


كود :
[COLOR=#0000BB]using System[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]Generic[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]ComponentModel[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Data[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Drawing[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Linq[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Text[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Windows[/color][color=#007700].[/color][color=#0000BB]Forms[/color][COLOR=#007700];
[/COLOR][COLOR=#0000BB]namespace WindowsFormsApplication20
[/COLOR][COLOR=#007700]{
public [/COLOR][color=#0000BB]partial [/color][color=#007700]class [/color][color=#0000BB]Form1 [/color][color=#007700]: [/color][COLOR=#0000BB]Form
[/COLOR][COLOR=#007700]{
public [/COLOR][color=#0000BB]Form1[/color][COLOR=#007700]()
{
[/COLOR][color=#0000BB]InitializeComponent[/color][COLOR=#007700]();
}
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]ArrayList myarr [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]ArrayList[/color][COLOR=#007700]();
private [/COLOR][color=#0000BB]void button1_Click[/color][color=#007700]([/color][color=#0000BB]object sender[/color][color=#007700], [/color][color=#0000BB]EventArgs e[/color][COLOR=#007700])
{
if ([/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]Directory[/color][color=#007700].[/color][color=#0000BB]Exists[/color][color=#007700]([/color][color=#DD0000]"c:\test"[/color][color=#007700]) == [/color][color=#0000BB]false[/color][COLOR=#007700])
{
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]Directory[/color][color=#007700].[/color][color=#0000BB]CreateDirectory[/color][color=#007700](@[/color][color=#DD0000]"c:\test"[/color][COLOR=#007700]);
}
foreach ([/COLOR][color=#0000BB]string x in System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]Directory[/color][color=#007700].[/color][color=#0000BB]GetFiles[/color][color=#007700](@[/color][color=#DD0000]"c:\windows\system32"[/color][COLOR=#007700]))
{
[/COLOR][color=#0000BB]myarr[/color][color=#007700].[/color][color=#0000BB]Add[/color][color=#007700]([/color][color=#0000BB]x[/color][COLOR=#007700]);
}
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]StreamWriter myw [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]StreamWriter[/color][color=#007700](@[/color][color=#DD0000]"c:\test\mytest.txt"[/color][COLOR=#007700]);
foreach ([/COLOR][color=#0000BB]string fx in myarr[/color][COLOR=#007700])
{
[/COLOR][color=#0000BB]myw[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]fx[/color][COLOR=#007700]);
}
[/COLOR][color=#0000BB]myw[/color][color=#007700].[/color][color=#0000BB]Close[/color][COLOR=#007700]();
}
}
}


[/COLOR]
جرب البرنامج بالضغط على الButton ولاحظ... سوف يتوقف البرنامج عن العمل لمدة حوال 1 ثانية ثم يتم إضافة أسماء الملفات الموجودة في c:\windows\system32 إلى الملف...
حسنا الان مع حوال 2000 ملف توقف البرنامج لمدة 1 ثانية ماذا لو كنا نود عمل فحص للكومبيوتر كاملا؟؟؟؟ سوف يتوقف البرنامج عن العمل لمدة قد تصل إلى 30 دقيقة أو أكثر (( الشيئ متعلق بسرعة الكومبيوتر وكمية الملفات ))
(( ملاحظة إذا لم تلاحظ توقف الكومبيوتر فأعد التجربة في مكان يحوي على ملفات أكثر ))

--- وهنا ومن أجل ذلك تم إختراع مبدأ ال multi-threading حيث أصبح بإمكانك عمل كل تحركاتك دون أي تأثير على أداء البرنامج لنأخذ مثال على نفس البرنامج مع ال multi-threading

ضع أيضا نقس الأدوات السابقة (Listbox,Button) واكتب الكود التالي:
كود :
using System[/COLOR][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]Generic[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]ComponentModel[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Data[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Drawing[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Linq[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Text[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Windows[/color][color=#007700].[/color][color=#0000BB]Forms[/color][COLOR=#007700];
[/COLOR][COLOR=#0000BB]namespace WindowsFormsApplication20
[/COLOR][COLOR=#007700]{
public [/COLOR][color=#0000BB]partial [/color][color=#007700]class [/color][color=#0000BB]Form1 [/color][color=#007700]: [/color][COLOR=#0000BB]Form
[/COLOR][COLOR=#007700]{
public [/COLOR][color=#0000BB]Form1[/color][COLOR=#007700]()
{
[/COLOR][color=#0000BB]InitializeComponent[/color][COLOR=#007700]();
}
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]ArrayList myarr [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]ArrayList[/color][COLOR=#007700]();
private [/COLOR][color=#0000BB]void button1_Click[/color][color=#007700]([/color][color=#0000BB]object sender[/color][color=#007700], [/color][color=#0000BB]EventArgs e[/color][COLOR=#007700])
{
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread mythread [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700]([/color][color=#0000BB]dowork[/color][COLOR=#007700]);
[/COLOR][color=#0000BB]mythread[/color][color=#007700].[/color][color=#0000BB]Priority [/color][color=#007700]= [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]ThreadPriority[/color][color=#007700].[/color][color=#0000BB]Lowest[/color][COLOR=#007700];
[/COLOR][color=#0000BB]mythread[/color][color=#007700].[/color][color=#0000BB]Start[/color][COLOR=#007700]();
}
private [/COLOR][color=#0000BB]void dowork[/color][COLOR=#007700]()
{
if ([/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]Directory[/color][color=#007700].[/color][color=#0000BB]Exists[/color][color=#007700]([/color][color=#DD0000]"c:\test"[/color][color=#007700]) == [/color][color=#0000BB]false[/color][COLOR=#007700])
{
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]Directory[/color][color=#007700].[/color][color=#0000BB]CreateDirectory[/color][color=#007700](@[/color][color=#DD0000]"c:\test"[/color][COLOR=#007700]);
}
foreach ([/COLOR][color=#0000BB]string x in System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]Directory[/color][color=#007700].[/color][color=#0000BB]GetFiles[/color][color=#007700](@[/color][color=#DD0000]"c:\windows\system32"[/color][COLOR=#007700]))
{
[/COLOR][color=#0000BB]myarr[/color][color=#007700].[/color][color=#0000BB]Add[/color][color=#007700]([/color][color=#0000BB]x[/color][COLOR=#007700]);
}
[/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]StreamWriter myw [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]IO[/color][color=#007700].[/color][color=#0000BB]StreamWriter[/color][color=#007700](@[/color][color=#DD0000]"c:\test\mytest.txt"[/color][COLOR=#007700]);
foreach ([/COLOR][color=#0000BB]string fx in myarr[/color][COLOR=#007700])
{
[/COLOR][color=#0000BB]myw[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]fx[/color][COLOR=#007700]);
}
[/COLOR][color=#0000BB]myw[/color][color=#007700].[/color][color=#0000BB]Close[/color][COLOR=#007700]();
[/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#DD0000]"Progress Completed!"[/color][COLOR=#007700]);
}
}
}




سوف تلاحظ عمل نفس الشيئ ولكن دون أي توقف أو بطئ للبرنامج مهما كان عدد الملفات...

أهم ما في الفئة Thread ...

1- Start وهي لبدأ ال Thread
2-Suspend لإيقاف الThread مؤقتا...
3- Abort لإيقاف ال Thread تهائيا...
4- Resume لإكمال ال Thread
5- IsBackGround ... جاء وقت شرحها...

إن ال BackGround Thread تتشابه بحد كبير مع ال Thread العادي ولكن الفرق يكمن بينهما في ما يلي...

أولا ضع Button وكتب في الحدث Click الخاص به:
كود :
[COLOR=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700].[/color][color=#0000BB]CurrentThread[/color][color=#007700].[/color][color=#0000BB]Abort[/color][COLOR=#007700]();


[/COLOR]
سوف تلاحظ أن البرنامج توقف عن العمل ولكن لماذا؟؟؟؟

السبب:
لم يعد هناك أي Fore Thread حي ولذلك تم إغلاق البرنامج ...

نتيجة... :إذا لم هناك أي Fore Thread قيد الإستخدام يغلق البرنامج...

أما لو كان ال Thread الذي يعمل مع برنامجك بشكل إفتراضي مع BackGround Thread فلن تراه في عمرك ...

فحتى لو كان هناك BackGround Thread حي و لا يوجد أي Fore Thread فسوف يغلق البرنامج دون أن يهتم بالباقي....

أما العكس فليس صحيح..

أرجو أن تكون قد إستفدت من هذا الدرس ولكن حديثنا عن ال Threads لم ينتهي بل سوف يكون هناك له بقية إن شاء الله للتجنب بالوقوع في أخطار هذه ال Thread لأن لها أخطار كبيرة على برنامجك... سوف تعرفها في ما يلي...


إلى اللقاء في الدرس القادم إن شاء الله...
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الدرس 22- دوال sql server RaggiTech 0 1,048 18-10-12, 04:11 PM
آخر رد: RaggiTech
  الدرس 21- Stored Procedures RaggiTech 0 929 18-10-12, 04:09 PM
آخر رد: RaggiTech
  الدرس 20- تنفيذ جمل الإستعلام insert-update-delete RaggiTech 2 968 18-10-12, 04:08 PM
آخر رد: RaggiTech
  الدرس 19- ربط قاعدة بيانات accessمع c#-vb.net وتنفيذ جمل إستعلام - الوضع المتصل RaggiTech 0 1,317 18-10-12, 03:41 PM
آخر رد: RaggiTech
  الدرس 18- ربط قاعدة بيانات sql مع c#-vb.net وتنفيذ جمل إستعلام - الوضع المتصل RaggiTech 0 2,469 18-10-12, 03:29 PM
آخر رد: RaggiTech
  الدرس 17- مقدمة إلى قواعد البيانات RaggiTech 0 736 18-10-12, 03:21 PM
آخر رد: RaggiTech
  الدرس 16- تصميم الأدوات الخاصة RaggiTech 0 702 18-10-12, 03:20 PM
آخر رد: RaggiTech
  الدرس 15- البداية مع gdi+ RaggiTech 1 752 18-10-12, 03:16 PM
آخر رد: RaggiTech
  الدرس 14- شرح تقنية ال wpf مع بعض الأمثلة RaggiTech 4 1,102 18-10-12, 03:12 PM
آخر رد: RaggiTech
  الدرس 12- شرح تقنية WCF والتخصص بال Sockets مع مثال RaggiTech 0 2,444 18-10-12, 02:57 PM
آخر رد: RaggiTech

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


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