منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
العمليات الفرعية - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : العمليات الفرعية (/showthread.php?tid=4894)



العمليات الفرعية - RaggiTech - 02-10-12

كاتب الموضوع : 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تم شرحها

بقي أن انوه أن العملية الفرعية يجب أن تكون خالية من الوسيطات، فلا يجب أن تكون العملية الفرعية بهذا الشكل

كود :
[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]

هذا ليس كل شيء عن العمليات الفرعية ما زال الكثير.