A_Alakkad
05-19-2009, 02:44 AM
الـCode يلي مستخدم هون هو للـC#
البرامج بشكلها الطبيعي بتشتغل بـThread وحده، او فينك تسميها Process او يلي هو
يعني الآله الحاسبة هيه Process بالنسبة للمعالج، والرسام هو Process أو Thread بالنسبة للمعالج .... الخ
هلئ الفكرة انو لما يكون البرنامج بدو يشتغل شغل كتير دسم، وبياكل وئت، فالـThread الأساسية يلي عم تشغل البرنامج ماعاد تلحق تشتغل كل الأمور المسنده ئلها بوئت واحد وببلش البرنامج يعلّئ وبيصفن شي شويه ( على حسب ضخامه العمليات) وبعدها بيرجع طبيعي، ئام مشان يحلو هالئصه هي ( عم احكي عن الدوت نت ) أمنوا عدة Classes ضمن الـFramework خاصه لهالعملية هي، فصار فينك تعمل اكتر من Thread خاصه ببرنامجك وتشغل على كل Thread مجموعه من العمليات لتخفف العبئ عن الـThread الاساسيه ( هو المشكله الاساسية انو الـThread الاساسية ماعاد تلحئ ترسم واجه البرنامج لما يكون في كتير ضغط، ولذلك بتلائيه بلش يعك ويكرّز)
ومن هي الـClasses واحد اسمو Thread
بما أنو الـThread الاساسية هي المسؤوله عن رسم واجه البرنامج والـControls يلي فيها، وبالتالي ما حتخلي Thread تانيه تعدّل على هدول الـControls، ولما Code من Thread تانيه بحاول يعدل شي خاصيه من خصائص أحد الـControls بيطلع الـException العجيب يلي بئول
Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.
ولذلك لتحل هالموضوع العجيب، ئدامك طريئين
يا اما طريئ سهل بس مو مضمون، لئن بيشتغل على المزاج ( بنائاً على التجربه العمليه )
وهيه انو تغير هي الـProperty لـtrue
كود PHP:
CheckForIllegalCrossThreadCalls = true;
او انو تستخدم الطريقه التانيه المثاليه وتصير متل الحبابين
ويلي بتخلي التغير يلي بدو يصير على الـControl يتنفذ بالـThread الأساسية او فينا نئول بالـThread يلي مسؤوله عن الـControl يلي عم يتغير
كود PHP:
public class CrossThreadManager
{
public delegate void ChangeLabelTextHandler(Label lbl, string text);
public delegate void ChangeControlEnableStateHandler(Control ctl, bool isEnabled);
public void ChangeLabelText(Label lbl, string text)
{
if (lbl.InvokeRequired)
{
ChangeLabelTextHandler cltHandler = new ChangeLabelTextHandler(this.ChangeLabelText);
lbl.Invoke(cltHandler, new object[] { lbl, text });
}
else
{
lbl.Text = text;
}
}
public void ChangeControlEnableState(Control ctl, bool isEnabled)
{
if (ctl.InvokeRequired)
{
ChangeControlEnableStateHandler ccesHandler = new ChangeControlEnableStateHandler(this.ChangeControl EnableState);
ctl.Invoke(ccesHandler, new object[] { ctl, isEnabled });
}
else
{
ctl.Enabled = isEnabled;
}
}
}
هلئ هاد الـClass فيه مثالين
الاول بغير الـText لـLabel
والتاني بغير الـEnable لحيلا Control
ببساطه بيشتغل كالآتي
بيفحص الـControl المعني اذا كان بحاجه ليعمل Invoke ويلي بتعني انو هل هو حالياً ضمن مجال Thread المالكه له او لا
فإذا ماكانت هيه الـThread الخاصه فيه، بيروح بيعمل Invoke للتابع الحالي، وبيردع بيفحص الشرط نفسو فبلائيه انو غير محقق، فبنط على الـelse وئتها بغير الـText بأمان
وبصير لما بدك تعدل شي بتعمل التالي
كود PHP:
CrossThreadManager ctManager = new CrossThreadManager();
ctManager.ChangeLabelText(LblName, "s3dan el fale7");
وطبعا لازم نعرف delegate ليمثل التابع المسؤول عن عمليه الـInvocation ولا حدا يسألني شو يعني delegate لانو بدها كومه شرح
هلئ الفكره من كل هالحكي انو لما الواحد بتصير معو هالمشكله فورا يستفيد من هالـClass هاد او يعدل عليه، احسن مايدوخ وهو مو عرفان شو صاير معو
منقول
البرامج بشكلها الطبيعي بتشتغل بـThread وحده، او فينك تسميها Process او يلي هو
يعني الآله الحاسبة هيه Process بالنسبة للمعالج، والرسام هو Process أو Thread بالنسبة للمعالج .... الخ
هلئ الفكرة انو لما يكون البرنامج بدو يشتغل شغل كتير دسم، وبياكل وئت، فالـThread الأساسية يلي عم تشغل البرنامج ماعاد تلحق تشتغل كل الأمور المسنده ئلها بوئت واحد وببلش البرنامج يعلّئ وبيصفن شي شويه ( على حسب ضخامه العمليات) وبعدها بيرجع طبيعي، ئام مشان يحلو هالئصه هي ( عم احكي عن الدوت نت ) أمنوا عدة Classes ضمن الـFramework خاصه لهالعملية هي، فصار فينك تعمل اكتر من Thread خاصه ببرنامجك وتشغل على كل Thread مجموعه من العمليات لتخفف العبئ عن الـThread الاساسيه ( هو المشكله الاساسية انو الـThread الاساسية ماعاد تلحئ ترسم واجه البرنامج لما يكون في كتير ضغط، ولذلك بتلائيه بلش يعك ويكرّز)
ومن هي الـClasses واحد اسمو Thread
بما أنو الـThread الاساسية هي المسؤوله عن رسم واجه البرنامج والـControls يلي فيها، وبالتالي ما حتخلي Thread تانيه تعدّل على هدول الـControls، ولما Code من Thread تانيه بحاول يعدل شي خاصيه من خصائص أحد الـControls بيطلع الـException العجيب يلي بئول
Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.
ولذلك لتحل هالموضوع العجيب، ئدامك طريئين
يا اما طريئ سهل بس مو مضمون، لئن بيشتغل على المزاج ( بنائاً على التجربه العمليه )
وهيه انو تغير هي الـProperty لـtrue
كود PHP:
CheckForIllegalCrossThreadCalls = true;
او انو تستخدم الطريقه التانيه المثاليه وتصير متل الحبابين
ويلي بتخلي التغير يلي بدو يصير على الـControl يتنفذ بالـThread الأساسية او فينا نئول بالـThread يلي مسؤوله عن الـControl يلي عم يتغير
كود PHP:
public class CrossThreadManager
{
public delegate void ChangeLabelTextHandler(Label lbl, string text);
public delegate void ChangeControlEnableStateHandler(Control ctl, bool isEnabled);
public void ChangeLabelText(Label lbl, string text)
{
if (lbl.InvokeRequired)
{
ChangeLabelTextHandler cltHandler = new ChangeLabelTextHandler(this.ChangeLabelText);
lbl.Invoke(cltHandler, new object[] { lbl, text });
}
else
{
lbl.Text = text;
}
}
public void ChangeControlEnableState(Control ctl, bool isEnabled)
{
if (ctl.InvokeRequired)
{
ChangeControlEnableStateHandler ccesHandler = new ChangeControlEnableStateHandler(this.ChangeControl EnableState);
ctl.Invoke(ccesHandler, new object[] { ctl, isEnabled });
}
else
{
ctl.Enabled = isEnabled;
}
}
}
هلئ هاد الـClass فيه مثالين
الاول بغير الـText لـLabel
والتاني بغير الـEnable لحيلا Control
ببساطه بيشتغل كالآتي
بيفحص الـControl المعني اذا كان بحاجه ليعمل Invoke ويلي بتعني انو هل هو حالياً ضمن مجال Thread المالكه له او لا
فإذا ماكانت هيه الـThread الخاصه فيه، بيروح بيعمل Invoke للتابع الحالي، وبيردع بيفحص الشرط نفسو فبلائيه انو غير محقق، فبنط على الـelse وئتها بغير الـText بأمان
وبصير لما بدك تعدل شي بتعمل التالي
كود PHP:
CrossThreadManager ctManager = new CrossThreadManager();
ctManager.ChangeLabelText(LblName, "s3dan el fale7");
وطبعا لازم نعرف delegate ليمثل التابع المسؤول عن عمليه الـInvocation ولا حدا يسألني شو يعني delegate لانو بدها كومه شرح
هلئ الفكره من كل هالحكي انو لما الواحد بتصير معو هالمشكله فورا يستفيد من هالـClass هاد او يعدل عليه، احسن مايدوخ وهو مو عرفان شو صاير معو
منقول