PDA

View Full Version : سوال: خطا در استفاده از نخ



antisocial
پنج شنبه 16 مهر 1388, 21:29 عصر
سلام

دوستان من یه همچین کدی دارم


private void button3_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(t1));
t.Start();

}
DataTable st = new DataTable();
void t1()
{

St= tb.Select("select * from p22 " +
"where field1 in (711431, 711473" +
",711471, 711324, 711455, 2711456, 459" +
",11327, 711472," +
"11410, 967863, 696344, 696346, 696348, 696455, 696456," +
"96457, 96315, 696371, 696372, 2694638, 2694631," +
"002128, 372825, 406490, 580556, 580540,91824,9, 3349" +
",43354) and field2 <>52051");
dataGridView1.DataSource = st;

}



متد سلکت یک دیتا تیبل پر از رکورد رو برمیگردونه که من میخوام همه ی رکوردارو توی دیتا گرید بریزم و به کاربر نشون بدم اما با این ارور مواجه میشم باید چه کار کنم؟


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

Sajjad.Aghapour
جمعه 17 مهر 1388, 12:41 عصر
دوست عزیز جواب شما استفاده از روش آسنکرون (Asyncronous) در استفاده از نخ ها هست....

اما جوابی بهتر:
وقتی این خطا یا هر خطای دیگه ای به شما نمایش داده میشه، لینکی به شما نمایش داده میشه با عنوان Get general help for this exception و چند لینک دیگه که شما رو به msdn راهنمایی میکنه و متوجه خطای مورد نظر و اشتباه خودتون میکنه.....

اگه Cross-Thread رو در msdn یا همین تالار جستجو کنید میبینید که نتایج زیادی برای شما نمایش داده میشه....

...
موفق باشید/
...

fadat_h
جمعه 17 مهر 1388, 23:31 عصر
سلام دوست عزیز
این خطا وقتی پیش میاد که هر thread به جز اون thread ی که شی گرافیکی رو ایجاد کرده باشه بخواد یه مقداری از اون شی رو دستکاری کنه.که در اینجا میخوای یه dataset رو به datagridview بدی.
و چاره کارت اینه که از delegate استفاده کنی.
به این شکل:


private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(Hello));
t.Start();
}

void Hello()
{
textBox1.Invoke(new new_delegate(new_Hello));
}

public delegate void new_delegate();
void new_Hello()
{
textBox1.Text = "Hello";
}

esmartiz_red
شنبه 18 مهر 1388, 23:28 عصر
یه راه ساده تر هم وجود داره از کد زیر استفاده کن
البته راه خیلی درستی نیست
البته این کد رو باید تو کلاس پایه فرمتون بذاری

CheckForIllegalCrossThreadCalls = false;

antisocial
یک شنبه 19 مهر 1388, 22:00 عصر
با تشکر از دو دوستی که راهنمایی کردن.
میخواستم بدونم آیا این تنها راه برای جلوگیری از هنگ کردن کامپیوتر هنگام بازخوانی داده هاست یا اینکه راه دیگه ای به غیر از نخ برای جلوگیری از هنگ کردن وجود داره؟
ممنون میشم اگر راهنمایی کنید

esmartiz_red
یک شنبه 19 مهر 1388, 22:30 عصر
اگر می خوای چند تا پردازش رو با هم انجام بدی و هم بتونی با برنامه کار کنی تا اونجا که من می دونم تنها راه استفاده از thread هست یا اگر راه دیگه ای هم باشه من بلد نسیتم
البته از کنترل background worker هم می تونی استفاده کنی اما این کنترل هم دقیقا می یاد با thread ها کار می کنه اما چون کنترل هست یکسری کارها رو راحتر کرده برای کد نویسی
امیدوارم تونسته باشم کمک کنم

shima_85
دوشنبه 20 مهر 1388, 05:58 صبح
من تو یه مثال ساده ،که دو تا کار انجام میده ،(یکی اینکه در thread اصلی یک message را نشون میده (در messageBox) و کار دوم که اونو تو thread گذاشتم ،یه progressbar است که براساس یه عدد random ،مقدارش ،تغییر میکنه) نوشتم ،ولی باز هم برنامه هنگ میکنه ،وقتیکه که progressbar داره کار میکنه و من دکمه ی message را می زنم.در صورتیکه از Thread هم استفاده شده.
چرا؟

esmartiz_red
سه شنبه 21 مهر 1388, 01:22 صبح
لطف کن برنامه ای که نوشتی بذار اینجا

antisocial
سه شنبه 21 مهر 1388, 02:43 صبح
دوست عزیز جواب شما استفاده از روش آسنکرون (Asyncronous) در استفاده از نخ ها هست....

میشه راجع به این روش و استفاده ازش بیشتر توضیح بدین.
اکثر دوستان اسم این روش رو توی سایت میارن اما در مورد کد و طرز کارش توضیحی نمیدن
اگر میشه توضیح بدید
با تشکر

Sajjad.Aghapour
سه شنبه 21 مهر 1388, 09:35 صبح
میشه راجع به این روش و استفاده ازش بیشتر توضیح بدین.
اکثر دوستان اسم این روش رو توی سایت میارن اما در مورد کد و طرز کارش توضیحی نمیدن
اگر میشه توضیح بدید
با تشکر

درباره مفهوم اون که قبلا توضیح داده شده. (کلمات کلیدی: آسنکرون - Asynchronous - غیرهمزمانی)

اما نحوه پیاده سازی :
1. پست شماره 3
2. Background Worker
3. درباره AsyncCallback و نحوه استفاده از این delegate جستجو کنید

...
موفق باشید/
...