![]() |
|
معلومة --- BackgroundWorker - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : معلومة --- BackgroundWorker (/showthread.php?tid=5337) |
معلومة --- BackgroundWorker - RaggiTech - 06-10-12 كاتب الموضوع : BADRMEDIA
العنصر BackgroundWorker أنه من العناصر الممتازة التنى جاءت به الدوت نت مع اصدار 2005 ولم يكن موجود من قبل وهو امتداد لمفهوم عمل مسارات Threading لعمليات التطبيق الواحد معلومة --- BackgroundWorker - RaggiTech - 06-10-12 الحدث DoWork هو الحدث الافتراضي للعنصر BackgroundWorker وهو المسئول عن تنفيذ العملية - ويكتب تحته العملية Statement كود : Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork====================================== عندما تريد تشغيل العنصر لكى يبدأ فى عمله تنادى عليه بالكود كود : Me.BackgroundWorker1.RunWorkerAsync()===================================== لنقوم بالمثال التالى لنجرب الأداة سوياً اكتب هذا الكود تحت الحدث الافتراضى للعنصر كود : Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWorkضع زر Button واكتب له هذا الحدث كود : Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clickضع مربع نص TextBox على الفورم شغل التطبيق ونفذ الأمر Button وابدأ اكتب فى TextBox ستجد أن العملية التى تحت العنصر BackgroundWorker تعمل فى مسار دون تعطيل الفورم بحيث يمكنك الكتابة فى مربع النص TextBox والتعامل مع الفورم عادى جداً ملحوظة : ربما كود اطلاق صوت Beep وعمل حلقة لا نهائية بعدم وصولها للرقم 100 كما فى المثال السابق ليس احترافي بصورة كاملة - لكن أردنا توضيح المثال بصورة بسيطة لكى نفهم عمل العنصر BackgroundWorker معلومة --- BackgroundWorker - RaggiTech - 06-10-12 تعلمنا فى المشاركة السابقة عن تطبيق لعمل المسار لعملية محددة منفصلة لكن ربما تريد أن تلغي هذه العلمية أثناء تنفيذها هناك خاصية خاصة بذلك يجب ان تجعل قيمتها تساوى True لتمكنك من ذلك أما من نافذة خصائص العنصر BackgroundWorker تجعل الخاصية WorkerSupportsCancellation تساوى True أو بالكود أثناء تحميل الفورم كود : Me.BackgroundWorker1.WorkerSupportsCancellation = Trueوليكن عندي هذه العملية كود : Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWorkلكي أشغل المسار نكتب كما نعرف كود : Me.BackgroundWorker1.RunWorkerAsync()ولكي نلغيها نكتب كود : Me.BackgroundWorker1.CancelAsync()لكن لابد الخاصية تساوي True كود : Me.BackgroundWorker1.WorkerSupportsCancellation = Trueمعلومة --- BackgroundWorker - RaggiTech - 06-10-12 الآن سنقوم بشئ جديد هل فكرت تربط أداة ProgressBar بمسار عملية ومدى تنفيذه لنري ذلك ضع أداة ProgressBar وزر Button على الفورم - بالطبع أيضاً عنصر BackgroundWorker فى الحدث الافتراضي للعنصر نكتب هذا الكود كود : Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWorkهذا الكود نوضحه الآن قمنا بعمل حلقة من إلى 100 نرسل إلي ReportProgress قيمة المتغير I وهو يبدأ من 0 حتى 100 وهى مدي نسبة تمام العملية أوضحنا للمسار Threading وقت TimeOut لكى يتم حجب المسار لو تعداه ويجب وضعه ويكون بالملى ثانية لأن فى حالة عدم وضعه يكون الافتراضي له صفر كود : System.Threading.Thread.Sleep(100)حتى الأن الأمور واضحة =========================================== نضع هذه الخصائص فى حدث تحميل الفورم كود : Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Loadوهى تحديد خاصية Minimum - Maximum للأداة ProgressBar جعلنا الخاصية WorkerReportsProgress للعنصر BackgroundWorker تساوي true لكى نستطيع أن نعود بقيمة نسبة تمام العملية الخصائص السابقة يمكن تعديها أثناء وقت التصميم من نافذة الخصائص لكل أداة ======================================= الحدث ProgressChanged للعنصر BackgroundWorker سنجعله يرسل قيمة نسبة التمام إلى قيمة ProgressBar لكى يتغير قيمة ProgressBar مع نسبة تمام العملية كود : Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged=========================================== الآن وبعد طول شرح وانتظار نبدأ على بركة الله اطلاق المسار كود : Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clickحيث نعيد ProgressBar إلى القيمة صفر لكى يكون فارغ ثم نشغل المشار معلومة --- BackgroundWorker - RaggiTech - 06-10-12 بالطبع اتضحت الرؤيا لك الآن أكثر وأكثر تعال نزيد من بعض التلميحات حول الموضوع نضع هذه الخصائص فى حدث تحميل الفورم كود : Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Loadلقد أزدنا فى حدث التحميل أن نشطنا خاصية WorkerSupportsCancellation للعنصر كود : Me.BackgroundWorker1.WorkerSupportsCancellation = True========================================== نجعل الكود للحدث DoWork كود : Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork============================================ الحدث ProgressChanged كما هو كود : Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged================================================ جاء دور حدث جديد وهو RunWorkerCompleted ويتم فى حالة المهمة انتهت أو توقفت كود : Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted===================================== كود : Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clickحدث الزر Button2 الخاص بالغاء العملية كود : Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Clickشغل التطبيق واستمتع معلومة --- BackgroundWorker - RaggiTech - 06-10-12 نقطة هامة اضافية عندما نبدأ تشغيل المسار نكتب كود : Me.BackgroundWorker1.RunWorkerAsync()لكن يمكن أن ترسل برامتر للحدث DoWork وهذا البرامتر تلقفه العنصر e الخاص بالحدث كمثال : كود : Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWorkهنا كتبنا حلقة For من صفر حتى e.Argumen لكن ما قيمة e.Argumen قيمتها ترسل كبرامتر أثناء اطلاق شعلة البدء كود : Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |