PDA

View Full Version : خطا در هنگام استفاده از Thread



morteza271
سه شنبه 06 اردیبهشت 1390, 13:28 عصر
سلام دوستان.

یه مشکلی دارم که بدجوری وقتم رو گرفته و اعصابم رو ...

داستان از این قراره که :

من یه تابع به اسم CreateNumber دارم که این تابع کارش اینه که عدد های بین دو عدد رو ایجاد میکنه.این دو عدد رو هم از داخل تکست باکس های داخل فرم میخونه.
مثلا بین دو عدد 10 و 15 عددهای 11و12و13و14و15 رو در دخل یه TreeView مینویسه :
کد اصلی این تابع :


int Number = FromNumber;
for (long i = FromNumber; i <= ToNumber; i++)
{
Number++;
tvNumberList.Nodes.Add("0" + Number.ToString());

Counter++;
radprog_value = (float)Counter / (float)Total;
radprog_value = radprog_value * 100;
}
و من میخوام همزمان با این کار یه پروگرس بار هم پر بشه.
که برای این کار با استفاده از ترد ها اینطوری کد نوشتم :

t1 = new Thread(new ThreadStart(CreateNumber));
t1.Start();

برای پر شدن پروگرش بار هم یه تایمر گذاشتم که مقدار Value پروگرس بار رو برابر radprog_value میکنه.

اما مشکل اونجاست که در داخل تابع به خط

tvNumberList.Nodes.Add("0" + Number.ToString());
گیر میده و خطای زیر رو میده :

Action being performed on this control is being called from the wrong thread. Marshal to the correct thread using Control.Invoke or Control.BeginInvoke to perform this action.

دوستان لطف کنن بهم کمک کنن.
با تشکر

hi level hdd
سه شنبه 06 اردیبهشت 1390, 15:02 عصر
با سلام
این مشکل به خاطر استفاده از thread هستش .هم میتونی از delegate استفاده کنی یا ساده ترش اینه که بری تو پوشه برنامت و فایل exe رو مستقیم
اجرا کنی و نه از طریق ویژوال استدیو

hi level hdd
سه شنبه 06 اردیبهشت 1390, 15:07 عصر
با سلام
این مشکل به خاطر استفاده از thread هستش .هم میتونی از delegate استفاده کنی یا ساده ترش اینه که بری تو پوشه برنامت و فایل exe رو مستقیم
اجرا کنی و نه از طریق ویژوال استدیو

ali.rezaei7
سه شنبه 06 اردیبهشت 1390, 17:20 عصر
سلام؛ خطا به این دلیل است که شما می خواهید به روش های معمول، از داخل Thread به اجزای یک Thread دیگر (تردی که کنترل مربوطه روی آن قرار داره) دسترسی پیدا کنید که این باعث بروز خطا می شود.
خب شما برای اینکه بتونید کنترل مورد نظرتون رو از طریق یک Thread دیگر آپدیت کنید، باید کنترل رو Invoke کنید! با اینکار یک delegate روی ترد کنترل اجرا میشه و از این طریق می تونید به کنترل دسترسی داشته باشید.

کد شما باید به این صورت اصلاح بشه:

tvNumberList.Invoke((MethodInvoker)delegate()
{
tvNumberList.Nodes.Add("0" + Number.ToString());

});


البته من نمی دونم که ساختار برنامه شما به جه صورت می باشد.شاید نیاز به تغییرات بیشتری داشته باشه.