02-10-12, 07:38 PM
كاتب الموضوع : DreamsDotNet
نحمده ونصلي على رسوله الكريمهذا المقال تعقيب بسيط على موضوع الأخ Mohammed Asaad
يعتمد نظام التشغيل بصورة أساسية على العمليات الفرعية وهذا يفسر تنقل المستخدم بين البرامج في نفس الوقت فالحاسب لا يستطيع أن يقوم بأكثر من عملية في نفس الوقت.
يكون لكل عملية رقم وموقع في الذاكرة، ويكون لها أولوية ونستطيع رؤية العمليات وتغيير أولوياتها من هنا:
هذا ليس موضوعنا لكن للمعرفة.
إلى الآن اتضحت فكرة العمليات الفرعية، لكن ما هي العملية الفرعية في التطبيق.
الأمور تتضح بالمثال:
ابدأ مشروع جديد، أضف زرين وانتقل للكود، ثم في مجال الأسماء اكتب
كود :
[color=#3366ff][FONT=Times New Roman]Imports [/FONT][/color][color=black][FONT=Times New Roman]System.Threading[/FONT][/color]
واكتب هذا الإجراء لإظهار رسالة
كود :
[FONT=Times New Roman][color=blue]Private[/color] [color=blue]Sub[/color] msg()[/FONT]
[FONT=Times New Roman]MsgBox([color=#a31515]"[/color][/FONT][color=#a31515][FONT=Times New Roman]يمكنك[/FONT][/color][color=#a31515][FONT=Times New Roman]استخدام[/FONT][/color][color=#a31515][FONT=Times New Roman]النموذج[/FONT][/color][color=#a31515][FONT=Times New Roman]."[/FONT][/color][FONT=Times New Roman])[/FONT]
[FONT=Times New Roman][color=blue]End[/color] [color=blue]Sub[/color][/FONT]
كود :
[FONT=Times New Roman][color=blue]Private[/color] [color=blue]Sub[/color] Button1_Click([color=blue]ByVal[/color] sender [color=blue]As[/color] System.Object, [color=blue]ByVal[/color] e [color=blue]As[/color] System.EventArgs) [color=blue]Handles[/color] Button1.Click[/FONT]
[FONT=Times New Roman]MsgBox([color=#a31515]"[/color][/FONT][color=#a31515][FONT=Times New Roman]لا[/FONT][/color][color=#a31515][FONT=Times New Roman]تستطيع[/FONT][/color][color=#a31515][FONT=Times New Roman]استخدام[/FONT][/color][color=#a31515][FONT=Times New Roman]النموذج[/FONT][/color][color=#a31515][FONT=Times New Roman]إلا[/FONT][/color][color=#a31515][FONT=Times New Roman]بعد[/FONT][/color][color=#a31515][FONT=Times New Roman]إغلاقي[/FONT][/color][color=#a31515][FONT=Times New Roman]!"[/FONT][/color][FONT=Times New Roman])[/FONT]
[FONT=Times New Roman][color=blue]End[/color] [color=blue]Sub[/color][/FONT]
كود :
[FONT=Times New Roman][color=blue]Private[/color] [color=blue]Sub[/color] Button2_Click([color=blue]ByVal[/color] sender [color=blue]As[/color] System.Object, [color=blue]ByVal[/color] e [color=blue]As[/color] System.EventArgs) [color=blue]Handles[/color] Button2.Click[/FONT]
[FONT=Times New Roman][color=blue]Dim[/color] tP [color=blue]As[/color] Thread = [color=blue]New[/color] Thread([color=blue]AddressOf[/color] msg)[/FONT]
[FONT=Times New Roman]tP.Start()[/FONT]
[FONT=Times New Roman][color=blue]End[/color] [color=blue]Sub[/color][/FONT]
طبعاً لا.
جرب الزر الثاني.
ماذا ترى، نعم ليس هذا وحسب، جرب إغلاق النافذة الرئيسية للنموذج ستبقى الرسالة ظاهرة
لماذا؟ لأن كل واحد منهما عملية مستقلة.
يمكنك إسناد القيمة True إلى خاصية العملية الفرعية IsBackground حتى يتم إغلاق العملية الفرعية مع النموذج
عدل الكود للزر الأول ليصبح
كود :
[FONT=Times New Roman][color=blue]Private[/color] [color=blue]Sub[/color] Button1_Click([color=blue]ByVal[/color] sender [color=blue]As[/color] System.Object, [color=blue]ByVal[/color] e [color=blue]As[/color] System.EventArgs) [color=blue]Handles[/color] Button1.Click[/FONT]
[FONT=Times New Roman][color=blue]Dim[/color] tP [color=blue]As[/color] Thread = [color=blue]New[/color] Thread([color=blue]AddressOf[/color] msg)[/FONT]
[FONT=Times New Roman]tP.IsBackground = [color=blue]True[/color][/FONT]
[FONT=Times New Roman]tP.Start()[/FONT]
[FONT=Times New Roman][color=blue]End[/color] [color=blue]Sub[/color][/FONT]
حسناً, ما الفائدة من هذا الأمر في تطبيقي؟
لو كان التطبيق يحمل بيانات كثيرة في حدث التحميل لن يظهر النموذج إلى بعد أن يقوم بتحميلها جميعاً، ولو صنعت تطبيق لضغط الملفات مثلاً سيكون على المستخدم الانتظار حتى تتم تلك العملية، لا مشكلة نقوم بكتابة Application.DoEvents()، نعم هذا حل لكن هذا الأمر يشكل عبأً على التطبيق ويساهم في تبطيء أداء العملية.
هنا تكمن أهمية العمليات الفرعية.
وسائل العمليات الفرعية شرحها الخ الفاضل.
أما الخصائص:
Highest أولوية عالية
AboveNormal فوق العادي
Normal عادي
BelowNormalأقل من العادي
Lowestالأقل
IsBackgroundتم شرحها
AboveNormal فوق العادي
Normal عادي
BelowNormalأقل من العادي
Lowestالأقل
IsBackgroundتم شرحها
بقي أن انوه أن العملية الفرعية يجب أن تكون خالية من الوسيطات، فلا يجب أن تكون العملية الفرعية بهذا الشكل
كود :
[color=blue][FONT=Times New Roman]Dim[/FONT][/color][FONT=Times New Roman] tP [color=blue]As[/color] Thread = [color=blue]New[/color] Thread([color=blue]AddressOf[/color] msg([color=#a31515]"Test"[/color]))[/FONT]
هذا ليس كل شيء عن العمليات الفرعية ما زال الكثير.