السلام عليكــم ورحمـة الله وبركاتــه ،،
سنقوم بإذن الله بشرح ال MultiThread Programs
نقصد ب MultiThread هو إمكانية تنفيذ أكثر من جزء من الكود في نفس الوقت
فوائد ال MultiThread :
1. السرعة في التنفيذ , تخيل أنك تريد تنفيذ كود معين عشر مرات وكل مرة تأخذ 1 دقيقة فعلى ذلك الوقت المتوقع هو 10 دقائق , لكن مع وجود ال MultiThread فإن الوقت المتوقع هو أقل من ذلك بكثير وذلك لأن الكود يعمل بشكل متوازٍ ز
2. لو تأملت البحث متصفح الملفات الخاص بالوندوز فإنك تجد أن النتائج تكون سريعة وليست مترتبة الأقراص , وذلك لأن المتصفح يستخدم MultiThread في البحث
ما يلزم معرفته قبل MultiThread :
1. معرفة شبه ممتازة ب delegate وذلك لأنه لغة التخاطب بين Thread و Thread أخرى.
ملاحظة : لمراجعة الدرس الخاص ب delegate قم بزيارة هذا الرابط
طريقة الاعلان عن Thread جديدة :
Thread هي كائن مثل أي كائن اخر أي أنها تحتاج إلى new
static void Main()
{
//لاحظ أن الميثود دخلت كباراميتر للكائن Thread
Thread thread = new Thread(ThreadMethod);
thread.Start();
//الكود الأول
MessageBox.Show("الكود الأول");
MessageBox.Show("انتهى تنفيذ الكود الأول");
}
static void ThreadMethod()
{
//الكود الثاني
//هذا الكود ينفذ بشكل متوازِ مع الكود الأول
MessageBox.Show("الكود الثاني");
MessageBox.Show("انتهى تنفيذ الكود الثاني");
}أردت من خلال هذا المثال أن أبين طريقة سير ال Thread فلاحظ المثال التالي وقارن النتائج بين المثال السابق وهذا المثال
static void Main()
{
//تم استدعاء الميثود بطريقة مباشرة من غير استخدام ال Thrad
ThreadMethod();
//الكود الأول
//هذا الكود لن ينفذ إلا بعد انتهاء الكود الأول
MessageBox.Show("الكود الأول");
MessageBox.Show("انتهى تنفيذ الكود الأول");
}
static void ThreadMethod()
{
//الكود الثاني
MessageBox.Show("الكود الثاني");
MessageBox.Show("انتهى تنفيذ الكود الثاني");
}أرجو أن يكون الفرق واضح .
شروط الميثود الخاصة بال Thread :
1. أن تكون من نوع void
2. أن لا تأخذ أي باراميتر
ما يحتويه الكائن Thread :
1. امكانية وقف مؤقت للتنفيذ Suspend ثم استكمال للتنفيذ Resume
2. امكانية الغاء التنفيذ Aboart
3. امكانية تحديد Priority
4. يوجد أكثر من ذلك .. يمكن الاطلاع عليها
مشاكل تصادفك عند استخدام ال Threads
1. دخول أكثر من Thread على بعضهم البعض مما يسبب CrossThread
قم بتنفيذ هذا الكود ولاحظ الخطأ الناتج
static Form form;
static void Main()
{
form = new Form();
form.Show();
Thread thread = new Thread(ThreadMethod);
thread.Start();
}
static void ThreadMethod()
{
//الخطأ نتج لأن ال form نشأ في Thread غير هذه ال Thread
form.Text = "Hello";
}لحل هذه المشكلة نستعم ال delegates لأنه لغة الحوار بين ال Threads
قم بتنفيذ هذا الكود ولاحظ الفرق
//الاعلان عن شكل ميثود
delegate void SetFormText(string Text);
static Form form;
static void Main()
{
form = new Form();
form.Show();
Thread thread = new Thread(ThreadMethod);
thread.Start();
MessageBox.Show("Finish");
}
static void ThreadMethod()
{
//تستخدم Invoke لتنفيذ الكود من خلال ال Thread الذي أنشأ فيه الform
form.Invoke(new SetFormText(SetText), "Hello");
}
static void SetText(string Text)
{
form.Text = Text;
}من هذا نستنتج أنه إذا لزمنا أن نتعامل مع أي Thread أخرى يجب أن نستخدم Invoke
يوجد مثال كامل في المرفقات على ما تم شرحه