Thread access to controls - سي شارب - مقـــالات - Top Coder
Welcome to our Site
الدخــول Or تسجـــيل
السبت
2016-12-10
5:35 PM
تسجــــيل | دخـــول
الرئيسية » مقالات » سي شارب

Thread access to controls
Thread access to controls

مقـــــــدمــه
في هذا المقال سوف نناقش مشكلة مشهورة جدا , وهي وصول thread الى كنترول تابع ل thread  اخر , ولعل الكثير مر عليه من قبل الخطأ
Cross-thread operation not valid: Control 'Form1' accessed from a thread
other than the thread it was created on.
وسوف نحاول ايضاح طريقة التعلب على هذا الخطأ
لماذا يظهر هذا الخطأ
كما ذكرنا في مقالاتنا السابقة في شرح ال threading ان اي برنامج به thread رئيسي , وذكرنا انه يمكن اضافة thread مساعد ليقوم بمهام معينه غير المهام التي يقوم بها ال thread الرئيسي
   للقراءة اكثر عن ال threading يرجى قراءة المقال التالي
وال thread الرئيسي يتبعه كل ما في البرنامج بخلاف ما يتبع اي thread اخر , فالفورم والكنترولز وكل هذا تابع للرئيسي , وكما ذكرنا فلا يمكن لأي thread ان يتدخل في اختصاص الاخر , فال thread المساعد لا يستطيع الوصول الى اي كنترولز في الفورم لأن هذه الكنترولز تابعه للرئيسي , لذلك يظهر الخطأ الشهير عندما تحاول الوصول الى اي كنترولز في الفورم من خلال اي thread اخر , والمثال الاتي سيوضح اكثر
حاول تنفيذ هذا البرنامج
 
عند تنفيذك البرنامج السابق فسوف يظهر لك الخطأ التالي
Cross-thread operation not valid: Control 'lb_txt' accessed from a thread other than the thread it was created on.

وهذا لأن ال thread المساعد ( th ) حاول الوصول الى كنترول تابع الى ال thread الرئيسي , حيث حاول تغيير في خاصيه ال Text للكنترول lb_txt , وهذا غير مسموح به حيث ان هذا من اختصاص الرئيسي 
استحدام ال Delegate في الوصول الى الكنترولز
وحل هذه المشكله يمكن ان يتم بطريقتين :
1- إما ان تضع سطر الكود التالي في حدث Form_load وينتهي الموضوع بسهوله
CheckForIllegalCrossThreadCalls = false;

2- او هناك حلا اطول بعض الشئ يتلخص في جزءين , اولا استخدام delegate يحمل الداله التي بها امر يتعلق باي كنترول -- ويجب الملاحظه انه لابد من تطابق ال delegate مع الداله --
للقراءة اكثر عن ال Delegates اقرأ المقال التالي

ثانيا استخدام الداله Invoke حتى يستطيع ال thread الوصول الى الكنترول
والكود التالي يشرح ذلك
Access the control by Invoke Method
 


وكما نرى فالداله Invoke تأخذ معامل من نوع delegate , وهو ال delegate الذي يحمل الداله التي بها امر يتطلب الوصول الى كنترول في ال thread الرئيسي .

ولعل هذه ايضاً من اهم فوائد واستخدامات ال delegate التي ذكرناها من قبل , حيث لا تستطيع الوصول الى اي كنترول داخل ال thread الاساسي للبرنامج بدون استخدام هذه الطريقه .

وسوف نقوم بشرح المزيد من استخدامات ال delegates و threading في المقالات القادمة نظراً لأهميتهما القصوى
تحميل المشروع
  Written by :  Mohammed Mahmoud
الفئة: سي شارب | أضاف: ham_mody2000 (2011-08-11 6:08 PM)
مشاهده: 1728 | تعليقات: 3 | الترتيب: 0.0/0


أترك تعليقك من خلال حسابك على الفيس بوك

تعليقات مشتركي الموقع

مجموع المقالات: 2
1  
وايضا ممكن في حدث الفورم لود تحت الكود ده وهو هايمنع هذا الخطأ:
CheckForIllegalCrossThreadCalls = False

2  
نشكرك على اضافتك , وقد تم اضافة الجزء الى المقاله
شكرا لك

إضافة تعليق يستطيع فقط المستخدمون المسجلون
[ التسجيل | دخول ]
طريقة الدخول
بحث
Our Facebook community

تم إطلاق صفحة توب كودر على الفيس بوك

Advertisment
الأحـــدث
hitstatus
Copyright Mohammed Mahmoud © 2016
إنشاء موقع مجاني с uCoz