تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الثامن والأربعون - Multithreading
#2
System.Threading.Thread

الفئة الاساسية في مجال الاسماء هذا ، تتيح لنا انشاء threads وتنفيذ مهامنا المختلفة عليها ، مكونات هذه الفئة الاساسية هي :

Sleep() : توقف عمل ال thread لفترة من الوقت .
IsAlive : قيمة توضح إذا كان ال thread ما زال يعمل ام لا .
IsBackground : إذا كان ال thread يعمل في background .
Priority : الأولوية الحالية .
ThreadState : حالة ال Thread .
Name : اسم ال thread .
Abort() : خروج .
Join() : توقف عمل ال thread حتى حدوث الحدث في join .
Resume() : استئناف العمل بعد ايقافه .
Start() : بدء العمل للمرة الأولى .
Suspend() : ايقاف العمل مؤقتاً .


سنقوم بداية بعمل تجربة سريعة للاستدلال على معنى ان يتم تنفيذ مهمتين في نفس الوقت ، نعود بعدها لاستئناف شرح المفاهيم الخاصة بالموضوع .

قم بتجربة الكود التالي :

c#:

كود :
[FONT=Tahoma]static void Main(string[] args)
{[/FONT]
[FONT=Tahoma]order1();
order2();
[/FONT]
[FONT=Tahoma]Console.ReadKey();
}[/FONT]
[FONT=Tahoma]static void order1()
{
for (int i = 0; i < 100; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(i.ToString() + " ");
}
}[/FONT]
[FONT=Tahoma]static void order2()
{
for (int i = 100; i > 0; i--)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(i.ToString() + " ");
}
}[/FONT]


vb.net:

كود :
[FONT=Tahoma]Private Shared Sub Main(ByVal args As String())

order1()
order2()


Console.ReadKey()
End Sub
Private Shared Sub order1() [/FONT]
[FONT=Tahoma]For i As Integer = 0 To 99
Console.ForegroundColor = ConsoleColor.Green
Console.Write(i.ToString() + " ")
Next
End Sub
Private Shared Sub order2() [/FONT]
[FONT=Tahoma]For i As Integer = 100 To 1 Step -1
Console.ForegroundColor = ConsoleColor.Red
Console.Write(i.ToString() + " ")
Next
End Sub [/FONT]



الكود كما هو واضح يقوم بطباعة الأرقام تصاعدياً وتنازلياً ، الناتج الطبيعي هو طباعة التصاعدي ومن ثم التنازلي ، في حين يتم طباعة نتائج الدالة الأولى بالأخضر والثانية بالأحمر للتفريق لتكون شاشة النتائج بالشكل التالي مثلاً :


وهذا الطبيعي ، يتم تنفيذ الدالة الأولى حتى الانتهاء ومن ثم الثانية حتى الانتهاء ، أما الآن سنقوم بتعريف threads مختلفة للتنفيذ بحيث يتم تنفيذ كل دالة على واحد منها حيث سيتم تنفيذهم على البروسيسور في نفس الوقت ، الكود التالي مثلاً :

c#:

كود :
[FONT=Tahoma]static void Main(string[] args)
{
System.Threading.Thread t1 = new System.Threading.Thread(order1);
t1.Start();[/FONT]
[FONT=Tahoma]System.Threading.Thread t2 = new System.Threading.Thread(order2);
t2.Start();[/FONT]
[FONT=Tahoma]Console.ReadKey();
}[/FONT]
[FONT=Tahoma]static void order1()
{
for (int i = 0; i < 100; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(i.ToString() + " ");
}
}[/FONT]
[FONT=Tahoma]static void order2()
{
for (int i = 100; i > 0; i--)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(i.ToString() + " ");
}
}[/FONT]


vb.net:


كود :
[FONT=Tahoma]Private Shared Sub Main(ByVal args As String())
Dim t1 As New System.Threading.Thread(order1)
t1.Start()

Dim t2 As New System.Threading.Thread(order2)
t2.Start()

Console.ReadKey()
End Sub
Private Shared Sub order1() [/FONT]
[FONT=Tahoma]For i As Integer = 0 To 99
Console.ForegroundColor = ConsoleColor.Green
Console.Write(i.ToString() + " ")
Next
End Sub
Private Shared Sub order2() [/FONT]
[FONT=Tahoma]For i As Integer = 100 To 1 Step -1
Console.ForegroundColor = ConsoleColor.Red
Console.Write(i.ToString() + " ")
Next
End Sub [/FONT]


الآن لنرى طبيعة النتائج .


بالطبع النتائج لن تكون كما هي كل مرة ، جرب تغيير ال Priority مثلاً لواحد منهم وجرب النتائج ، ستجد أن صاحب الأولوية الأعلى يتم الانتهاء منه قبل الثاني ، الكود التالي مثلاً :


كود :
[FONT=Tahoma]t1.Priority = System.Threading.ThreadPriority.Highest;[/FONT]


ستصبح النتائج بالشكل التالي :




ستجد اختلافات في التنفيذ ، لكن الشاهد هو أن الكودين تم تنفيذهم سوية في هذا الوقت .


بالطبع ليس هذا هو استخدام الوحيد لل threads ، ولكنها كانت فقط مقدمة سريعة . سنعود ونواصل .
}}}
تم الشكر بواسطة: rabia al hamdani


الردود في هذا الموضوع
الدرس الثامن والأربعون - Multithreading - بواسطة Raggi Tech - 14-10-12, 05:15 PM


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


يقوم بقرائة الموضوع: