الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح Multithread Programs

بدأه akramKamal في 18 أكتوبر 2009 · 4 رد · 3,143 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

سنقوم بإذن الله بشرح ال MultiThread Programs

نقصد ب MultiThread هو إمكانية تنفيذ أكثر من جزء من الكود في نفس الوقت

فوائد ال MultiThread :

1. السرعة في التنفيذ , تخيل أنك تريد تنفيذ كود معين عشر مرات وكل مرة تأخذ 1 دقيقة فعلى ذلك الوقت المتوقع هو 10 دقائق , لكن مع وجود ال MultiThread فإن الوقت المتوقع هو أقل من ذلك بكثير وذلك لأن الكود يعمل بشكل متوازٍ ز

2. لو تأملت البحث متصفح الملفات الخاص بالوندوز فإنك تجد أن النتائج تكون سريعة وليست مترتبة الأقراص , وذلك لأن المتصفح يستخدم MultiThread في البحث

ما يلزم معرفته قبل MultiThread :

1. معرفة شبه ممتازة ب delegate وذلك لأنه لغة التخاطب بين Thread و Thread أخرى.

ملاحظة : لمراجعة الدرس الخاص ب delegate قم بزيارة هذا الرابط

/index.php?showtopic=190506

طريقة الاعلان عن 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

يوجد مثال كامل في المرفقات على ما تم شرحه

TestMultiThread.rar

تم تعديل هذه المشاركة بواسطة akramKamal في 18 أكتوبر 2009 في 17:43

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#2

بالنيابة عن نفسي وعن جميع من قرءوا هذه المقالة اتقدم اليك أخي akramKamal بالشكر الجزيل على ما تفضلت به من شرح مفيد جداً.

وأود ان اسالك اخي الكريم التالي :

1) قولك : //الخطأ نتج لأن ال form نشأ في Thread غير هذه ال Thread .. أيعني هذا بأن كل البرنامج أصلا ..وبكل الفورمز التابعة له.. له ثريد رئيسي ؟.. وهل هذا الثريد الرئيسي يعمل عن طريق ارتباطه بالميثود main الرئيسية ؟ إن كان فهمي خاطئا فأرجو منك توضيح هذه النقطة.

2) هل يُمكن بنفس طريقة المثال الاخير التعامل مع datagridview يقوم لها أكثر من ثريد بتعبئة سطورها بالمعلومات؟

مرة أخرى شكرا جزيلا على جهودكم أخي الكريم.

#3

السلام عليكــم ورحمـة الله وبركاتــه ،،

بالنسبة للسؤال الأول :

نعم فهمك صحيح للأمر . هناك Thread رئيسية للبرنامج ترتبط بتنفيذ الميثود main الرئيسية

بالنسبة للسؤال الثاني:

نعم يمكن ..

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#4
akramKamal كتب:
السلام عليكــم ورحمـة الله وبركاتــه ،،

بالنسبة للسؤال الأول :

نعم فهمك صحيح للأمر . هناك Thread رئيسية للبرنامج ترتبط بتنفيذ الميثود main الرئيسية

بالنسبة للسؤال الثاني:

نعم يمكن ..

شكرا لك أخي akramKamal على الايضاح.. ودمتم بخير :)

#5
اقتباس

شروط الميثود الخاصة بال Thread :

1. أن تكون من نوع void

2. أن لا تأخذ أي باراميتر

بكل تأكيد الميثود يمكن أن تـأخذ باراميتر عادي. لي عودة ان شاء الله

Just Be Nice

مواضيع مشابهة