PDA

View Full Version : سوال: خطا در اجرای Thred



vb develop
سه شنبه 17 شهریور 1388, 01:55 صبح
سلام دوستان من دارم یک سری اطلاعات از بانک میخونم و در datagrid نمایش میدم اما چون کمی زمان بر هست دارم از یک نخ پردازشی جدا استفاده میکنم

یه این صورت :

Thread T = new Thread(SetChangeCourse);
T.Start();


این هم تابع مورد نظر :

private void SetChangeCourse()
{
object[] Obj = Skin.Class.ClassObj.ReturnReady_SelectedCourseClas s(CMB_CourseCollection.Text);
if (Obj != null)
{
Grid_ReadyClass.DataSource = (DataSet)Obj[0];
Grid_ReadyClass.DataMember = Obj[1].ToString();
Grid_ReadyClass.RetrieveStructure();
}
object[] Obj2 = Skin.Class.ClassObj.Return_ClassHistory(CMB_Course Collection.Text);
if (Obj2 != null)
{
Grid_ClassHistory.DataSource = (DataSet)Obj2[0];
Grid_ClassHistory.DataMember = Obj2[1].ToString();
Grid_ClassHistory.RetrieveStructure();
Grid_ClassHistory.HeaderFormatStyle.TextAlignment = Janus.Windows.GridEX.TextAlignment.Center;
foreach (Janus.Windows.GridEX.GridEXColumn CLM in Grid_ClassHistory.Tables[0].Columns)
{
CLM.TextAlignment = Janus.Windows.GridEX.TextAlignment.Center;
CLM.CellToolTip = Janus.Windows.GridEX.CellToolTip.TruncatedText;
}
Grid_ClassHistory.Tables[0].Columns[5].Width = 70;
}

}

کد تابع بالا زیاد مهم نیست (از یک سری کلاس ها و توابعی کهخودم نوشتم درم توش استفاده میکنم.)

اشکال کار ایجاست که وقتی نخ رو اجرا میکنم خطای زیر رو در خط
Grid_ReadyClass.RetrieveStructure();

نشون میده .

متن خطا :


Cross-thread operation not valid: Control 'Grid_ReadyClass' accessed from a thread other than the thread it was created on.

اما هر چی فکر میکنم نمی دونم از کجاست،آخه من جای دیگه ای از این کنترل استفاده نمیکنم که Cross به وجود بیاد
حتی وقتی lock هم برای متد قرار میدم باز هم همین خطا رو میده !!!

لطفا راهنمایی کنید مشکل کجاست.

Sajjad.Aghapour
سه شنبه 17 شهریور 1388, 04:54 صبح
فکر می کنم شما دارید از کنترل janus استفاده می کنید.دستور زیر که محل خطای شماست:


Grid_ReadyClass.RetrieveStructure();

در واقع پیکربندی داده ها در داخل DataGrid رو به عهده داره و به همین دلیل خطای Cross-Thread به شما نمایش داده میشه.....
این قطعه رو در یه تابع دیگه بنویسید و توسط یه delegate اون تابع رو invoke کنید....